并发WCF通过共享通道调用

时间:2010-04-02 17:37:58

标签: wcf caching channel

我有一个Web层,可以将调用转发到应用程序层。 Web层使用共享的缓存通道来执行此操作。有问题的应用程序层服务是无状态的,并且启用了并发性。

但他们并没有同时被召唤。

如果我在每次调用时更改Web层以创建新通道,那么我执行会在应用层上获得并发调用。但是我希望避免这种成本,因为它对于我的场景在功能上是不必要的。我没有会话状态,也不需要每次都重新验证调用者。我知道渠道工厂的创建远比创建渠道要贵,但如果可能的话,我仍然希望避免这样做。

我在MSDN上发现this article表示:

  

创建渠道和客户   它们是通道线程安全的   可能不支持写作超过   同时向电线发送一条消息。   如果您要发送大邮件,   特别是如果流式传输,发送   操作可能阻止等待   另一个发送完成。

首先,我不发送大量消息(因为我正在进行负载测试,只是很多小消息),但我仍然看到阻塞行为。其次,这是一个相当开放和无益的文档。它说他们“可能不”支持编写多条消息,但没有解释他们支持并发消息的场景。

任何人都可以对此有所了解吗?

附录:我还在考虑创建一个Web服务器用来满足请求的频道池。但同样,我认为没有理由为什么我现有的方法应该阻止,如果可能的话我宁愿避免复杂性。

3 个答案:

答案 0 :(得分:2)

经过多次讨论,这一切都归结为我在使用它之前没有明确地在频道上调用Open这一事实。显然,隐式Open可以在某些情况下排除并发性。

答案 1 :(得分:1)

您可以缓存WCF代理,但仍然为每个服务调用创建一个通道 - 这将确保并发性,与从头开始创建通道相比,并不是非常昂贵,并且不需要为每个调用重新进行身份验证。这可以在Wenlong Dong的博客上解释 - "Performance Improvement for WCF Client Proxy Creation in .NET 3.5 and Best Practices"(比MSDN更好的WCF信息和指导来源)。

答案 2 :(得分:1)

仅为完整性:这是一篇博客文章,解释了在未明确打开频道时观察到的请求序列化行为:

http://blogs.msdn.com/b/wenlong/archive/2007/10/26/best-practice-always-open-wcf-client-proxy-explicitly-when-it-is-shared.aspx

相关问题