技术开发 频道

.NET 3.5中WCF客户端代理性能改进实战

  【IT168技术】在.NET 3.0 SP1(与.NET 3.5一起发布) 中,WCF客户端创建有一个重要的性能改进。对BasicHttpBinding 来说,性能已经接近于创建ASMX代理。

  ASMX 代理 vs WCF 代理

  ASMX 代理比WCF代理更简单。前者是类型System.Web.Services.Protocols.SoapHttpClientProtocol的一个包装。在ASMX世界中,编程模型是两条平行线:

  ① 没有ServiceContract的概念。客户端代理中的所有服务操作(WebMethod)的签名都是唯一的。客户端直接通过SoapHttpClientProcotol.Invoke来调用那些操作。所以在服务接口和底层消息处理系统上没有差别。

  ② 没有明确的信道栈。SoapHttpClientProtocol在客户端包装了所有东西。它直接调用System.Net API HttpWebRequest.

  相反WCF提供一种“垂直的”编程模型。你可以在客户端得到像服务端一样丰富的编程特性。WCF内部代理是一个包装在类型System.ServiceModel.Channels.ServiceChannel内部的.NET远程传输代理。传输代理允许你执行必要的类型转换并让你像使用ServiceContract接口那样使用代理调用服务操作。

  创建WCF 代理的代价

  有两种创建WCF客户端代理(信道)的常用方法:

  ①使用WCF默认支持的ClientBase,你可以使用svcutil.exe来生成客户端代理代码。

  ②使用ChannelFactory.CreateChannel().

  ClientBase类型化代理的常用模式是在每次调用过程中执行创建/释放资源:

    // You may add try/catch block here ...
    CalculatorClient clientProxy
= new CalculatorClient();
    clientProxy.Open();
    
// Make a call with the proxy
    clientProxy.Add(
1, 2);
    clientProxy.Close();
    
// Error handling code here ..

   这里CalculatorClient是通过svcutil.exe自动生成的而且是ClientBase的一个子类。

  在.NET 3.0 中,创建/释放WCF客户端代理都是一个非常昂贵的操作。比ASMX代理要差很多。方案A在内部创建ChannelFactory.每个代理都保留一个ChannelFactory作为私有字段。ChannelFactory的生命周期完全由代理控制。方案B 能稍微好一些因为你可以自己控制ChannelFactory对象并能够实现只创建一次从而节省进一步创建代理的消耗。

  为什么创建/释放ChannelFactory会如何昂贵?这是因为它涉及了以下几个主要操作:

  ① 构造ContractDescription树

  ② 反射所有需要的CLR类型

  ③ 构造信道栈

  ④ 释放所有资源

  大多数情况下,这些数据在以相同方式创建的不同代理之间是相同的。

  在.NET 3.0 SP1(与.NET 3.5 一起发布),在这部分有两个主要的性能改进:

  ① ClientBase内部对ChannelFactory进行缓存。这显著改进了方案A的性能。

  ② 改进了信道管理逻辑并使方案A 和 B都能受益。

  通过这些改进,创建WCF代理的性能与ASMX有相当可比性。

0
相关文章