【问题标题】:How does WCF take care of multiple client calls to the server?WCF 如何处理对服务器的多个客户端调用?
【发布时间】:2010-12-23 18:37:04
【问题描述】:

想清楚地了解 WCF 的工作原理。 假设一个 WCF 服务公开了一个函数 A。 现在客户端创建了 5 个线程,每个线程调用不同参数的函数 A。

我认为这应该发生 - 函数 A 的每个线程调用都会为该函数创建一个新实例。有人可以证实这一点。 我写了一个 POC,它没有这样做,它给出的结果不一致。

【问题讨论】:

    标签: multithreading wcf


    【解决方案1】:

    这取决于您通过实现服务合同的类上的 ServiceBehavior 属性进行的服务配置:

    [ServiceBehavior(
        InstanceContextMode = InstanceContextMode.PerSession, 
        ConcurrencyMode = ConcurrencyMode.Multiple)]
    

    使用参数InstanceContextMode,您可以告诉 WCF 您希望如何托管您的服务:

    • 单一:将创建一个服务类实例,用于接收所有服务调用
    • PerSession:将为每个正在连接的客户端创建一个新实例
    • PerCall(默认):每个客户端的每次调用都会创建一个新实例

    接下来是同步,当一个宿主对象接收并行操作调用时。您可以使用ConcurrencyMode 参数控制行为:

    • 单次(默认):WCF 序列化所有操作,因此您的服务实例一次只执行一个或不执行一个操作调用。
    • 可重入:WCF 将所有操作调用直接委托给您的服务实例,但将调用同步到服务操作中的另一个 WCF 服务(我认为很少使用)。
    • 多个:WCF 将所有操作调用直接委托给您的服务实例,而不进行同步。您必须自己担心同步。

    【讨论】:

    • 请注意:ConcurrencyMode.Multiple 会导致所有内容都是多线程的,因此编程更加困难和棘手。它也仅在 InstanceContextMode.Single(单例)案例中真正具有任何切实的好处。尽可能避免这种情况——这只是不必要的复杂,并且不会在每次调用或每次会话中产生任何性能改进
    • 是的,所以我写了你负责同步。但我认为这在很大程度上取决于您的用例,哪个选项是最佳的。一开始最好使用 ConcurrencyMode.Single
    【解决方案2】:

    默认情况是每次调用都会创建一个新的 wcf 服务实例,这已记录在案,例如here

    【讨论】:

    • 完全正确 - “每次调用”模型 - 每个调用都会获得一个新的服务类实例 - 是首选和默认的实例化模型。伟大的 MSDN 杂志文章来说明这一点
    • 默认其实是PerSession。在 2006 年的 CTP 版本中,它曾经是 PerCall,但在发布之前进行了更改。但是,如果绑定不支持会话(例如 BasicHttpBinding),它将按照调用方式运行。
    【解决方案3】:

    没有像新的函数实例这样的东西。这将是类的实例。

    您可以通过更改适当的元属性来配置您的服务的行为方式。

    您可以在每次调用时实例化您的服务实现。它也可以作为单例(所有调用的唯一服务实例)。

    Here you can find information on creating singleton WCF service

    And here there is a lot more about WCF services

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 2017-04-15
      相关资源
      最近更新 更多