我有一个WCF服务,在负载条件下一直给我这个错误(否则我似乎无法重新创建错误)。我们一直试图找到解决方法大约一个星期,现在没有这样的运气..
我看到的错误有两个部分,
System.ServiceModel.CommunicationException: 错误:(请求已中止: 请求被取消了。)发生了 通过http传输数据 信道。
和
System.Net.WebException:请求 被中止:请求是 取消。
我见过很多人建议通过重载Reference.cs
文件中的方法并设置KeepAlive = false
来禁用处于保持活动状态,但是,我们的客户端正在使用服务引用(除了网页参考)此选项不再存在。
我看到的另一个选项是向服务添加自定义绑定,而不是我们现在使用的BasicHttpBinding
,但是这会对那些使用webReference的人提供Web服务的后退支持(从那以后) CustomBinding
未启用SOAP。)
之前是否有人处理此错误?有没有办法在不影响服务器端的情况下禁用WCF中的keep alive?还有其他任何可以导致此错误的活着吗?
答案 0 :(得分:6)
我认为HTTP keep alive不会对此负责。 WCF应该能够自己处理这个问题,因此HTTP持久连接在请求之间共享,如果它到期(它在100s of inactivity之后到期),WCF会创建新的连接而不会触发任何异常。如果您的连接在请求传输期间中止,那么我预计会出现其他一些问题。
您可以将此自定义绑定用作BasicHttpBinding,而不使用HTTP保持活动:
<bindings>
<customBinding>
<binding name="NoKeepAlive">
<textMessageEncoding messageVersion="Soap11" />
<httpTransport keepAliveEnabled="false" />
</binding>
</customBinding>
</bindings>
答案 1 :(得分:4)
尝试上传大文件时遇到此问题。我不得不将此添加到Web服务的web.config
<system.web>
<httpRuntime maxRequestLength="10240" />
答案 2 :(得分:1)
我有同样的问题。 在我的情况下,我正在异步执行请求。我从我的客户那里向'服务器'发送了几百个请求。我正在使用basicHttpBinding。在我的app.config设置中,openTimeout属性设置为60秒或一分钟。一旦我把它设置为更大的数字,比如10分钟,问题就消失了。
例如,我在app.config文件中更改了所有这些值:
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IScriptRunHost" closeTimeout="00:10:00"
openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
到10分钟。
答案 3 :(得分:0)
此错误也可能是由于将using
子句与对WCF服务的异步调用混合而引起的。
例如:
using (ServiceClient proxy = new ServiceClient(proxyName)) {
proxy.Open();
return proxy.FunctionCallAsync(parameters); //Return type being Task<ResultSet>
}
这将触发一个竞争条件,介于它可以如何处置proxy
到完成异步Task<ResultSet>
的速度之间。任务花费的时间越长,最终可能会以Faulted状态出现,并且结果包含System.ServiceModel.CommunicationException。
这可以通过删除using子句来解决:
ServiceClient proxy = new ServiceClient(proxyName))
proxy.Open();
return proxy.FunctionCallAsync(parameters); //Return type being Task<ResultSet>
请注意,proxy
也应保留,以便异步调用完成后就可以完成proxy.Close()
。
答案 4 :(得分:0)
将此添加到app.config
<system.net>
<connectionManagement>
<add address="*" maxconnection="5"/>
<add address="https://api.limitedconnections.com*" maxconnection="2"/>
<add address="https://api.moreconnections.com*" maxconnection = "10"/>
</connectionManagement>
</system.net>
请参阅下面的链接
https://cdijkgraaf.wordpress.com/2019/12/02/configuring-maxconnection-in-biztalk/