为什么缓存WCF频道是件坏事?

时间:2011-05-31 21:32:55

标签: wcf caching channel

我一直在线阅读很多WCF文章,似乎大多数人都会缓存ChannelFactory对象而不是频道本身。看起来大多数人都害怕使用频道缓存,因为他们不想处理可能导致缓存频道无法使用的网络故障。但是,通过在方法上捕获CommunicationException,重新创建通道并使用Reflection重放方法,可以很容易地解决这个问题。

然后有人认为进行频道缓存是不好的,因为所有通信都将通过单一频道进行。见以下文章。

http://social.msdn.microsoft.com/Forums/is/wcf/thread/9cbdf92a-a749-40ce-9ebe-3f2622cd78ee

这一定是件坏事吗?你能跨线程分享频道吗?性能是否会受到影响,因为对此单个通道的多个方法调用将被串行处理?

我没有发现共享频道会降低性能的证据。我发现使用缓存通道的速度比使用非缓存通道快5倍,即使这意味着必须使用Reflection来调用缓存通道上的方法。

另一个优点是,当你完成它时,不必用try / catch / finally语句包围你所有的WCF调用来调用通道上的Close(),Abort()或Dispose()。对我而言,似乎WCF通过强迫开发人员必须管理WCF频道资源而向错误的方向迈出了一步。在.NET Remoting中,您使用Activator类创建了代理,并且您无需执行任何操作来清理它。 .NET Framework为您处理了所有这些。

1 个答案:

答案 0 :(得分:10)

2个主要原因:

  1. ChannelFactory创建起来很昂贵且线程安全=>完美的缓存候选者。
  2. 由频道工厂生成的频道创建起来并不昂贵,但它不是线程安全的(实际上它是线程安全的,但并发呼叫将被阻止并顺序执行)=>不要将其缓存在多线程环境中。
  3. 这是一个nice article,详细介绍。