我刚刚阅读了 Wenlong Dong 的这篇关于 WCF ChannelFactory 缓存的精彩文章。
我的问题很简单,你怎么能证明 ChannelFactory 实际上是在调用之间被缓存的?我遵循了有关 ClientBase 构造函数的规则。我们在继承自 ClientBase 的对象上使用以下重载构造函数:
ClientBase(string endpointConfigurationName, EndpointAddress remoteAddress);
在上面提到的文章中指出:
对于这些构造函数,所有参数(包括默认参数)都在以下列表中:
· InstanceContext 回调实例
· 字符串端点配置名称
· 端点地址远程地址
只要在构造 ClientBase 时这三个参数相同,我们就可以放心地假设可以使用相同的 ChannelFactory。幸运的是,String 和 EndpointAddress 类型是不可变的,也就是说,我们可以通过简单的比较来确定两个参数是否相同。对于 InstanceContext,我们可以使用 Object 引用比较。EndpointTrait 类型因此被用作 MRU 缓存的键。
为了测试 ChannelFactory 缓存理论,我们正在检查 ClientBase 构造函数中的哈希码,例如 var testHash = RuntimeHelpers.GetHashCode(base.ChannelFactory);
调用之间的哈希值不同,这使我们认为 ChannelFactory 实际上没有被缓存。
有什么想法吗?
问候
迈尔斯