WCF ChannelFactory缓存

时间:2010-01-21 05:46:44

标签: wcf channelfactory

我刚刚在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实际上没有被缓存。

有什么想法吗?

此致

迈尔斯

2 个答案:

答案 0 :(得分:1)

我知道这个问题有点陈旧,但由于没有答案,如果有人有同样的问题:

从您提到的文章:

  

在ClientBase的内部通道(透明代理)之前   创建后,当前ClientBase的缓存逻辑可以   如果其他公共属性(如ChannelFactory,Endpoint,   访问和ClientCredentials。

这意味着针对ChannelFactory.GetHashCode()实例调用ClientBase<IService>实际上会导致缓存被禁用。

答案 1 :(得分:0)

我也有这个问题,当我为多个电话保存代理对象时,我的性能非常快。

我真正想要的是能够在每次调用时创建和使用代理,但是在后台进行缓存和优化。

和你一样,我遵循了微软建议的指导方针,包括将我的绑定配置从代码中移到.config文件中(我不想这样做)。

我认为这应该是微软在架构中应该处理的事情,感觉太像我为了性能而交易代码质量。如果有的话,他们应该为我们提供一个构造函数,允许缓存而不存在.config ...