15

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

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

System.ServiceModel.CommunicationException: An error: (The request was aborted: the request was cancelled.) 在通过 http 通道传输数据时发生。

和:

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

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

我见过的另一个选择是向服务添加自定义绑定,而不是BasicHttpBinding我们现在使用的,但这会妨碍那些一直使用 webReference 的人对 web 服务的向后支持(因为CustomBinding没有启用 SOAP)。

有没有人处理过这个错误?有没有办法在不影响服务器端的情况下禁用 WCF 中的保持活动?是否还有其他已知会导致此错误的保持活动?

4

5 回答 5

8

我不认为 HTTP 保持活动对此负责。WCF 应该能够自行处理此问题,因此 HTTP 持久连接在请求之间共享,并且如果它过期(它在100 秒不活动后过期)WCF 会创建新连接而不会引发任何异常。如果您的连接在请求传输期间中止,那么我预计还会有其他问题。

您可以将此自定义绑定用作等效于 BasicHttpBinding 而无需 HTTP 保持活动:

<bindings>
  <customBinding>
    <binding name="NoKeepAlive">
      <textMessageEncoding messageVersion="Soap11" />
      <httpTransport keepAliveEnabled="false" />
    </binding>
  </customBinding>
</bindings> 
于 2010-10-10T11:38:08.597 回答
5

我在尝试上传大文件时遇到了这个问题。我必须将此添加到 Web 服务的 web.config

<system.web>
  <httpRuntime maxRequestLength="10240" />
于 2013-09-06T13:55:36.637 回答
2

我有这个完全相同的问题。就我而言,我正在异步执行请求。我从我的客户端向“服务器”发送了几百个请求。我正在/正在使用 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 分钟。

于 2011-09-06T11:35:03.037 回答
1

在 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/

于 2020-07-30T11:53:20.737 回答
0

此错误也可能是由于混合using了对 WCF 服务的异步调用的子句。

例如:

using (ServiceClient proxy = new ServiceClient(proxyName)) {
  proxy.Open();
  return proxy.FunctionCallAsync(parameters); //Return type being Task<ResultSet>
}

这将触发处理proxy速度与异步Task<ResultSet>完成速度之间的竞争条件。任务花费的时间越长,它就越有可能最终处于故障状态并且结果包含 System.ServiceModel.CommunicationException。

这可以通过删除 using 子句来解决:

ServiceClient proxy = new ServiceClient(proxyName))
proxy.Open();
return proxy.FunctionCallAsync(parameters); //Return type being Task<ResultSet>

请注意,它也proxy应该被持久化,以便一旦异步调用完成,proxy.Close()就可以完成。

于 2020-02-06T18:32:53.473 回答