底层连接被关闭:连接被意外关闭

Posted

技术标签:

【中文标题】底层连接被关闭:连接被意外关闭【英文标题】:The underlying connection was closed: The connection was closed unexpectedly 【发布时间】:2010-09-22 01:41:07 【问题描述】:

此异常始终在 SOAP 请求上引发,该请求需要近三分钟才能接收,大小为 2.25 兆。

在网上搜索时,我发现各种帖子似乎都是关于在请求上设置标头,有些人希望我不发送“Expect:”标头,有些人希望我发送“Keep-Alive:”标头,但无论我发送的标头如何,我仍然会收到这个讨厌的错误。我不相信设置任何标头是我的答案,因为我可以使用“curl”重新创建完全相同的请求,并且响应最终会毫无问题地返回

我的<httpRuntime maxRequestLength="409600" executionTimeout="900"/>

我觉得我的选择已经不多了。如果有人可以提供任何帮助,我将不胜感激。需要注意的其他一些事情是,我正在从中请求数据的服务器不在我的控制范围内,这些请求也是通过 https 进行的,而其他响应较小的请求可以完美地工作。

谢谢

【问题讨论】:

我认为这个问题与负载均衡服务器有关。 【参考方案1】:

您将帖子标记为 .NET35,那么您在使用 WCF 吗?

如果是这样,以下是我们用于大型数据集的 App.config 示例:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="32" maxStringContentLength="8388608" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:1602/EndPoint.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding" contract="IEndPointContract" name="EndPoint" behaviorConfiguration="EndpointBehaviour" />     
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="EndpointBehaviour">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

【讨论】:

不,我想我可能会考虑转换为 WCF……我认为原始代码是从 2.0 甚至 1.1 编写的飞行员移植过来的。【参考方案2】:

希望现在回答这个问题还为时不晚。

尝试在合约接口的定义中添加以下属性:

[ServiceKnownType(typeof(ReturnClass))]

有关允许返回多态类的更通用解决方案,请参阅这篇文章: http://www.goeleven.com/blog/entryDetail.aspx?entry=45

【讨论】:

【参考方案3】:

如果您使用 dbml 而不是 edmx,您将得到这个(底层连接已关闭:连接已意外关闭。)因为 dbml 不会返回它需要数据合同的可序列化数据,因此请转到 dbml 文件的属性并更改序列化模式为单向。

【讨论】:

这解决了我的问题,谢谢 sharmaja!不过,还有一点需要注意:我必须在客户端更新我的服务参考才能使其正常工作。希望这对处于相同情况的其他人有所帮助。【参考方案4】:

你试过this Blog Post的建议吗?问题很可能在于 .NET 的 TCP/HTTP 堆栈实现。

【讨论】:

是的,试过了,没有运气,对我来说它似乎只是设置了一个标题“连接:保持活动” 因此您需要调试 .NET HTTP/TCP 堆栈实际在做什么。尤其是与 curl 相比它做错了什么。您应该在 SOAP 请求和服务器之间放置 Wireshark(TCP 网络嗅探器)或 Fiddler(HTTP 代理)。这样您应该能够发现差异。 好吧,我已经将“Web 服务”转换为 WCF 服务,如果这没有帮助,我会试试这个,但需要研究如何更好地过滤结果wireshark... 或者 Fiddler 更好。 Fiddler 一般更适合 HTTP 调试。但是,有时可能需要 TCP 级别的分析。您是否注意到 Wireshark 中的“跟随 TCP 流”功能?这样可以节省不少时间。 不,我没有注意到,我一定会调查的,谢谢!【参考方案5】:

我收到此错误是因为我的 datatransfereobjects 以递归方式相互引用。

例如:

客户->(有)->评级 评级->(属于)->客户

所以你必须删除循环。

[DataContract]
public class Rating

    private Customer _customer;
    //[DataMember] // <-  EITHER HERE 
    public Customer Customer
    
        get  return _customer; 
        set  _customer = value; 
    



[DataContract]
public class Customer

    private long _customerID;
    [DataMember]
    public long CustomerID
    
        get  return _customerID; 
        set  _customerID = value; 
    

    [DataMember] // <- OR HERE
    public Rating Rating
    
        get  return _rating; 
        set  _rating = value; 
    

【讨论】:

谢谢,您的解决方案帮助了我。【参考方案6】:

尝试了几种方法来消除此错误消息,直到找到此解决方案: http://kiranpatils.wordpress.com/2008/09/22/the-underlying-connection-was-closed-the-connection-was-closed-unexpectedly-while-returning-data-table-from-wcf-service/

您可以将您的 List 更改为 DataSet。我怀疑 DataSet 可以处理比 List 更多的数据。

希望对你有帮助。

【讨论】:

【参考方案7】:

我也遇到了同样的问题,经过深入调查,我发现了这篇文章:

Merrick Chaffer's Blog

这都与为客户端和服务器设置“dataContractSerializer”有关。 希望这会有所帮助。

【讨论】:

【参考方案8】:

我添加了另一个字段,但该属性没有设置。 这是我针对相同错误的解决方案。

[DataMember]
public bool HasValue

    get  return true; 
    set  //adding this line made the solution.

【讨论】:

【参考方案9】:

如果存在内部错误,这是一个一般性错误。

尝试在此处添加跟踪:http://msdn.microsoft.com/en-us/library/ms732023(v=vs.110).aspx

然后您将看到完整的日志。

【讨论】:

【参考方案10】:

对于带有 EF 的 WCF,只需在上下文类中添加以下代码即可。

base.Configuration.ProxyCreationEnabled = false;

【讨论】:

以上是关于底层连接被关闭:连接被意外关闭的主要内容,如果未能解决你的问题,请参考以下文章

httpWebRequest请求错误,基础连接已经关闭: 连接被意外关闭

如何在向某些站点发出 HttpWebRequest 时修复“底层连接已关闭:连接已意外关闭”

延迟加载 - (实体框架)底层连接意外关闭

大文件上传(WebException:连接被意外关闭)

底层连接已关闭:接收时发生意外错误

权限被拒绝(公钥、密码)。 rsync:连接意外关闭 - gitlab