我可以创建一个WCF,其中多个调用不会互相阻塞

本文关键字:调用 创建 一个 WCF 我可以 | 更新日期: 2023-09-27 18:09:29

我有一个WebAPI应用程序,它使用HTTP连接调用WCF服务。对WebAPI的调用来自用户浏览器。WCF服务被托管在一个单独的IIS应用程序中。

由于一些遗留代码,WCF服务中的一个方法是一个长时间运行的过程,例如30秒,它产生一个大字节数组,然后我们可以返回并传递。

还有另一个方法,它不是一个长时间运行的过程,应该立即返回。然而,当客户端调用长进程时,另一个方法被阻止完成,直到长进程完成。

我尝试了很多东西,比如在服务中添加以下内容:

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

,并在配置中添加以下内容:

  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "100" />
    </connectionManagement>
  </system.net>

并关闭会话状态:

<sessionState mode="Off" />

然而,我无法让这些调用并行工作。我明白这是与WCF服务防止会话问题的方式有关,但我已经关闭了aspNetCompatibilityEnabled,我不使用HttpContext会话或缓存,所以我不确定是什么导致了块。

我能做些什么来让这些调用并行工作,而不需要对它们进行重大的重新工作?

我可以创建一个WCF,其中多个调用不会互相阻塞

这可能不是最好的解决方案,但我发现在上述情况下,将reliableSession设置为false似乎可以解决问题。我个人最后没有使用它,但我会把它贴出来,以防别人需要它。

下面是我在wcf web.config中使用的设置。不要忘记在客户端也将可靠会话设置为false。

  <wsHttpBinding>
    <binding name="BindingName" receiveTimeout="00:20:00" maxReceivedMessageSize="10485760">
      <reliableSession enabled="false"/>
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" />
        <message establishSecurityContext="true" clientCredentialType="None" />
      </security>
    </binding>
  </wsHttpBinding>

默认情况下,ReliableSession确保按照发送的顺序传递消息。查看这个:System.ServiceModel.ReliableSession.Ordered

需要设置Orderedfalse !

内部设置ReliableSessionBindingElement的值。如果这仍然不起作用,您也可以尝试将ReliableSessionBindingElementFlowControlEnabled的值设置为false