技术开发 频道

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

  禁用缓存

  WCF支持当ChannelFactory被打开之前修改ChannelFactory和ContractDescription设置的扩展形式。对一个新创建的代理做如下改动会阻止它与其他代理共享同样的信道。ClientBase的其他属性也是同样的逻辑:

ChannelFactory
Endpoint
ClientCredentials

   当内部信道被创建且ClientBase.Open被调用以后任何对ClientBase属性的访问都会导致对应代理的缓存被禁用。这是很自然的,因为你也不想让一个代理重用为其他代理设置的不同契约或者安全设置的ChannelFactory。

  信道管理

   每个内部创建的信道都会被添加到System.ServiceModel.Channels.CommunicationObjectManager. 从这个类中添加/删除一个元素的性能已经在.NET 3.5 中改进。这是通过内部将List换成Hashtable 实现的。这也是为什么方案2会有性能改进。

  非常好的实践

  现在我得谈论一下内部实现了,我想总结一下如何使用WCF代理来实现非常好的性能。

  重用同样的代理

  在很多情况,你会想重用同样的代理。因为这样会极大地提升性能。尤其是当你使用安全特性而对安全协议进行初始化很耗资源的情况下。

  不要忘记在再使用代理之前要显式打开它。

  使用代理来开启缓存

  正如上面提到的,你可以使用ChannelFactory.CreateChannel来创建代理或者使用自动生成的代理。如果你使用后者,你需要注意以下几点以使ChannelFactory被系统缓存:

  ① 不要使用代理中将绑定作为参数的构造函数,你可以将绑定信息放到配置文件中去。

  ②不要访问代理的ChannelFactory、Endpoint 和 ClientCredentials的公共属性。

  禁用缓存

  如果你真的想禁用缓存,你可以简单地通过违反以上条件来实现。在一些场景,由于下面两个原因可能导致你不想让所有线程都使用同样的代理:

  ① 信道的上下文不允许多线程访问。

  ② 当使用一个单一代理时信道栈可能会有一些影响性能的瓶颈。

  缓存的逻辑可以是非常简单,也可以是非常复杂。总之要记住以下几点:

  ① 你需要为管理代理而实现正确的同步逻辑。

  ② 你需要保证使用同样的代理。有时候,你可能想要为代理实现一个循环利用模式。

  ③ 你需要处理异常并重建缓存。

  ④ 缓存大小需要限制并且可以配置。

  ⑤ 你可能需要创建代理即便缓存池中没有可以使用的代理。

0
相关文章