代码之家  ›  专栏  ›  技术社区  ›  Kent Boogaart

通过共享通道并发wcf调用

  •  3
  • Kent Boogaart  · 技术社区  · 16 年前

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

    但它们并不是同时被调用的。

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

    我发现 this article 在MSDN上声明:

    而由 通道是线程安全的,它们 可能不支持写入超过 同时向线路发送一条消息。 如果你要发送大消息, 尤其是流式传输时, 操作可能会阻止等待 另一个发送完成。

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

    有人能解释一下吗?

    附录:我也在考虑创建一个通道池,web服务器用来满足请求。但是,我不明白为什么我现有的方法会被阻塞,如果可能的话,我宁愿避免这种复杂性。

    3 回复  |  直到 12 年前
        1
  •  2
  •   Dietrich Epp    12 年前

    经过一番周折,这一切都归结为我没有打电话 Open 在使用之前在频道上显式显示。显然是一个含蓄的 正常开放 在某些情况下可以排除并发性。

        2
  •  1
  •   Bermo    16 年前

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

        3
  •  1
  •   Jan    15 年前

    为了完整起见:这里有一个blog条目解释了未显式打开通道时观察到的请求序列化行为:

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