【问题标题】: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 进行的,而其他响应较小的请求可以完美地工作。

谢谢

【问题讨论】:

  • 我认为这个问题与负载均衡服务器有关。

标签: c# asp.net web-services .net-3.5


【解决方案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;

            【讨论】:

              猜你喜欢
              • 2012-04-26
              • 1970-01-01
              • 2013-05-31
              • 1970-01-01
              相关资源
              最近更新 更多