4

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

有什么想法吗?

问候

迈尔斯

4

2 回答 2

1

我知道这个问题有点老了,但是没有答案,如果有人有同样的问题:

从你提到的文章中:

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

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

于 2014-02-19T16:17:48.913 回答
0

我也遇到过这个问题,当我为多个调用保存代理对象时,我得到了非常快的性能。

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

像您一样,我遵循了 microsoft 建议的指导方针,包括将绑定配置从代码中移出并放入 .config 文件中(我不想这样做)。

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

于 2010-08-26T19:46:02.133 回答