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

时间:2014-06-19 16:48:58

标签: c# asp.net wcf asp.net-web-api

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

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

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

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

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

并将以下内容添加到配置中:

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

关闭会话状态:

<sessionState mode="Off" />

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

我可以采取哪些措施让这些调用并行工作,而无需对其进行重大修改?

2 个答案:

答案 0 :(得分:0)

这可能不是最好的解决方案,但是我发现将可靠的会话设置为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>

答案 1 :(得分:0)

默认情况下,ReliableSession确保消息按发送顺序传递。检查一下:System.ServiceModel.ReliableSession.Ordered

您需要将Ordered设置为false

在内部它设置ReliableSessionBindingElement的值。如果仍然无法解决问题,您还可以尝试将FlowControlEnabled的{​​{1}}的值设置为ReliableSessionBindingElement