通过共享通道的并发WCF调用

通过共享通道的并发WCF调用,wcf,caching,channel,Wcf,Caching,Channel,我有一个web层,它将调用转发到应用层。web层使用共享、缓存的通道来执行此操作。所讨论的应用层服务是无状态的,并且启用了并发性 但它们并没有被同时调用 如果我改变web层以在每次调用时创建一个新的通道,那么我确实会在应用层上获得并发调用。但我想避免这一成本,因为在我的场景中,这在功能上是不必要的。我没有会话状态,也不需要每次都重新验证调用方。我知道创建渠道工厂比创建渠道要昂贵得多,但如果可能的话,这仍然是我希望避免的成本 我在MSDN上发现: 而由 这些通道是线程安全的,它们 可能不支持编写超

我有一个web层,它将调用转发到应用层。web层使用共享、缓存的通道来执行此操作。所讨论的应用层服务是无状态的,并且启用了并发性

但它们并没有被同时调用

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

我在MSDN上发现:

而由 这些通道是线程安全的,它们 可能不支持编写超过 同时向有线电视发送一条消息。 如果您正在发送大型消息, 特别是在流媒体的情况下,发送 操作可能会阻止等待 另一个发送完成

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

有人能解释一下吗


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

您可以缓存WCF代理,但仍然为每个服务调用创建一个通道-这将确保并发性,与从头创建通道相比,成本不是很高,并且不需要对每个呼叫进行重新身份验证。这一点在董文龙的博客(一个比MSDN更好的WCF信息和指导来源)上有解释。

经过一番努力,这一切都归结于我在使用频道之前没有在频道上明确地调用
Open
。显然,隐式的
Open
在某些情况下可能会排除并发性。

为了完整起见:下面是一篇博客文章,解释在不显式打开通道时观察到的请求序列化行为:


+1根据我问题中的附录,池是我的备份方法。但是,我仍然想知道在什么情况下可以成功地通过并发共享单个代理。除非我遗漏了什么,否则这篇博文不会涵盖这些情况。太好了。请你加一份推荐信好吗?老实说,我想我没有。有各种各样的帖子为我提供了提示,但我还没有看到一篇明确显示auto-open如何阻止并发调用的帖子。我记得当时打算自己写一篇文章,但一直没有想到。我会将它添加到我的队列中,当它启动时,我会发回这里。你能给出一个如何创建频道的代码示例吗?我正在努力解决同样的问题,在ChannelFactory上调用Open()对我的情况没有帮助。我想强调一些场景,因为它取决于您使用的绑定。当使用BasicHttpBinding时,它确实起作用,但当使用NetNamedPipe绑定时,所有调用仍然是同步的。