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

Ric*_*per 6 c# asp.net wcf asp.net-web-api

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

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

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

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

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.PerCall)]
Run Code Online (Sandbox Code Playgroud)

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

  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "100" />
    </connectionManagement>
  </system.net>
Run Code Online (Sandbox Code Playgroud)

并关闭会话状态:

<sessionState mode="Off" />
Run Code Online (Sandbox Code Playgroud)

但是,我无法让这些调用并行工作.我知道这与WCF服务防止Session问题的方式有关,但是我已经关闭了aspNetCompatibilityEnabled,我没有使用HttpContext会话或缓存,所以我不确定导致阻塞的原因.

关于如何让这些调用并行工作而不对其进行重大修改的任何想法?

Ste*_*lls 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>
Run Code Online (Sandbox Code Playgroud)