System.Net.WebException:请求已中止:请求已取消

时间:2010-10-10 11:04:07

标签: .net wcf system.net.webexception service-reference communicationexception

我有一个WCF服务,在负载条件下一直给我这个错误(否则我似乎无法重新创建错误)。我们一直试图找到解决方法大约一个星期,现在没有这样的运气..

我看到的错误有两个部分,

  

System.ServiceModel.CommunicationException:   错误:(请求已中止:   请求被取消了。)发生了   通过http传输数据   信道。

  

System.Net.WebException:请求   被中止:请求是   取消。

我见过很多人建议通过重载Reference.cs文件中的方法并设置KeepAlive = false来禁用处于保持活动状态,但是,我们的客户端正在使用服务引用(除了网页参考)此选项不再存在。

我看到的另一个选项是向服务添加自定义绑定,而不是我们现在使用的BasicHttpBinding,但是这会对那些使用webReference的人提供Web服务的后退支持(从那以后) CustomBinding未启用SOAP。)

之前是否有人处理此错误?有没有办法在不影响服务器端的情况下禁用WCF中的keep alive?还有其他任何可以导致此错误的活着吗?

5 个答案:

答案 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/