禁用缓存
WCF支持当ChannelFactory被打开之前修改ChannelFactory和ContractDescription设置的扩展形式。对一个新创建的代理做如下改动会阻止它与其他代理共享同样的信道。ClientBase
Endpoint
ClientCredentials
当内部信道被创建且ClientBase
信道管理
每个内部创建的信道都会被添加到System.ServiceModel.Channels.CommunicationObjectManager. 从这个类中添加/删除一个元素的性能已经在.NET 3.5 中改进。这是通过内部将List
非常好的实践
现在我得谈论一下内部实现了,我想总结一下如何使用WCF代理来实现非常好的性能。
重用同样的代理
在很多情况,你会想重用同样的代理。因为这样会极大地提升性能。尤其是当你使用安全特性而对安全协议进行初始化很耗资源的情况下。
不要忘记在再使用代理之前要显式打开它。
使用代理来开启缓存
正如上面提到的,你可以使用ChannelFactory
① 不要使用代理中将绑定作为参数的构造函数,你可以将绑定信息放到配置文件中去。
②不要访问代理的ChannelFactory、Endpoint 和 ClientCredentials的公共属性。
禁用缓存
如果你真的想禁用缓存,你可以简单地通过违反以上条件来实现。在一些场景,由于下面两个原因可能导致你不想让所有线程都使用同样的代理:
① 信道的上下文不允许多线程访问。
② 当使用一个单一代理时信道栈可能会有一些影响性能的瓶颈。
缓存的逻辑可以是非常简单,也可以是非常复杂。总之要记住以下几点:
① 你需要为管理代理而实现正确的同步逻辑。
② 你需要保证使用同样的代理。有时候,你可能想要为代理实现一个循环利用模式。
③ 你需要处理异常并重建缓存。
④ 缓存大小需要限制并且可以配置。
⑤ 你可能需要创建代理即便缓存池中没有可以使用的代理。