我刚刚在Wenlong Dong的WCF ChannelFactory缓存中阅读了这个great article。
我的问题是你怎么能真正证明ChannelFactory实际上是在调用之间缓存的?我遵循了有关ClientBase构造函数的规则。我们在继承自ClientBase的对象上使用以下重载的构造函数:
ClientBase(string endpointConfigurationName,EndpointAddress remoteAddress);
在上述文章中指出:
对于这些构造函数,所有参数 (包括默认的)在 以下列表:
·InstanceContext callbackInstance
·字符串 endpointConfigurationName
·EndpointAddress remoteAddress
只要这三个论点是 ClientBase是一样的 构建,我们可以安全地假设 可以使用相同的ChannelFactory。 幸运的是,String和 EndpointAddress类型是不可变的, 也就是说,我们可以进行简单的比较 确定是否有两个参数 相同。对于InstanceContext,我们可以 使用对象引用比较。该 因此,类型EndpointTrait 用作MRU缓存的密钥。
为了测试ChannelFactory缓存理论,我们检查ClientBase构造函数中的Hashcode,例如var testHash = RuntimeHelpers.GetHashCode(base.ChannelFactory);
调用之间的哈希值不同,这使我们认为ChannelFactory实际上没有被缓存。
有什么想法吗?
此致
迈尔斯
答案 0 :(得分:1)
我知道这个问题有点陈旧,但由于没有答案,如果有人有同样的问题:
从您提到的文章:
在ClientBase的内部通道(透明代理)之前 创建后,当前ClientBase的缓存逻辑可以 如果其他公共属性(如ChannelFactory,Endpoint, 访问和ClientCredentials。
这意味着针对ChannelFactory.GetHashCode()
实例调用ClientBase<IService>
实际上会导致缓存被禁用。
答案 1 :(得分:0)
我也有这个问题,当我为多个电话保存代理对象时,我的性能非常快。
我真正想要的是能够在每次调用时创建和使用代理,但是在后台进行缓存和优化。
和你一样,我遵循了微软建议的指导方针,包括将我的绑定配置从代码中移到.config文件中(我不想这样做)。
我认为这应该是微软在架构中应该处理的事情,感觉太像我为了性能而交易代码质量。如果有的话,他们应该为我们提供一个构造函数,允许缓存而不存在.config ...