调用 SOAP 时,“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”

Posted

技术标签:

【中文标题】调用 SOAP 时,“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”【英文标题】:"The underlying connection was closed: A connection that was expected to be kept alive was closed by the server" when calling SOAP 【发布时间】:2018-07-22 19:12:36 【问题描述】:

在调用另一个 WSDL 服务时,我有时会收到错误“底层连接已关闭:服务器关闭了预期保持活动状态的连接”。

我使用 .Net 4.5 WCF 服务,我的应用程序连接到外部 3rd 方 SOAP-WSDL 服务以执行操作。对该服务的大多数调用都成功完成,但有一个特定调用,其中 5% 的调用因该错误而失败

The underlying connection was closed: A connection that was expected to be kept alive was closed by the server

下面是该服务的 bindingConfiguration

<bindings>
      <customBinding>
        <binding name="AnotherServiceSoap12Binding" openTimeout="01:30" receiveTimeout="01:30" sendTimeout="01:30" closeTimeout="01:30">
          <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="999999" />
          </textMessageEncoding>
          <httpTransport manualAddressing="false" 
            allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" keepAliveEnabled="true" 

                maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
            proxyAuthenticationScheme="Anonymous" realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" useDefaultWebProxy="true" />
        </binding>
      </customBinding>
    </bindings>

我还从日志中注意到连接没有超时,大约需要不到 10 秒的时间才会出现错误。

知道问题出在哪里,或者我如何获得更多数据来检测问题的根本原因。我还需要知道修复应该来自我的客户端应用程序还是来自第 3 方服务。

【问题讨论】:

【参考方案1】:

您应该检查您的客户端端点绑定openTimeout="01:30" receiveTimeout="01:30" sendTimeout="01:30" closeTimeout="01:30" 的客户端配置是否与您的第 3 方服务相同,并且您的传输需要满足双方所需的要求。

<httpTransport manualAddressing="false" allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" keepAliveEnabled="true" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"            proxyAuthenticationScheme="Anonymous" realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" useDefaultWebProxy="true" />

当客户端超时大于服务器超时时会发生此错误。 为避免此错误,您的 receiveTimeout 和 sendTimeout 应增加。

【讨论】:

以上是关于调用 SOAP 时,“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”的主要内容,如果未能解决你的问题,请参考以下文章

调用rest服务时,soap服务中的请求格式确定失败

在php中调用soap函数时出错

使用 Apache CXF 调用 SOAP API 时发生 ClassCastException

在调用Web服务时,是否有一种简单的方法可以获取请求的soap消息和响应的soap消息?

从.NET调用WCF服务时如何以编程方式添加soap标头?

Salesforce SOAP 接口集成服务