3

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

但它们不会同时被调用。

如果我更改 Web 层以在每次调用时创建一个新通道,那么我确实会在应用程序层上获得并发调用。但我想避免这种成本,因为它在我的场景中在功能上是不必要的。我没有会话状态,也不需要每次都重新验证调用者。我知道创建通道工厂比创建通道要昂贵得多,但如果可能的话,我仍然想避免这种成本。

我在 MSDN 上找到了这篇文章,其中指出:

虽然由通道创建的通道和客户端是线程安全的,但它们可能不支持同时向线路写入多个消息。如果您正在发送大型消息,特别是在流式传输时,发送操作可能会阻塞等待另一个发送完成。

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

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

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

4

3 回答 3

2

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

于 2010-04-04T15:34:58.393 回答
2

您可以缓存 WCF 代理,但仍为每个服务调用创建一个通道 - 这将确保并发性,与从头开始创建通道相比不是很昂贵,并且不需要为每个调用重新验证。这在 Wenlong Dong 的博客“.NET 3.5 中的 WCF 客户端代理创建和最佳实践的性能改进”中进行了解释(比 MSDN 更好的 WCF 信息和指导来源)。

于 2010-04-02T22:19:05.533 回答
1

仅出于完整性考虑:这是一个博客条目,解释了在未显式打开通道时观察到的请求序列化行为:

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

于 2010-10-14T15:20:57.150 回答