【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类型化代理的常用模式是在每次调用过程中执行创建/释放资源:
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有相当可比性。