我可以创建一个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会话或缓存,所以我不确定是什么导致了块。
我能做些什么来让这些调用并行工作,而不需要对它们进行重大的重新工作?
这可能不是最好的解决方案,但我发现在上述情况下,将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
需要设置Ordered
为false
!
内部设置ReliableSessionBindingElement
的值。如果这仍然不起作用,您也可以尝试将ReliableSessionBindingElement
的FlowControlEnabled
的值设置为false
。