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

时间:2008-11-12 20:56:28

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

这个异常一直抛在SOAP请求上,接收时间差不多是三分钟,大小为2.25兆。

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

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

我觉得我的选择已经用完了。如果有人能提供任何帮助,我将非常感激。还有一些需要注意的事情是,我正在请求数据的服务器不在我的手中,这些请求也是通过https进行的,而其他响应较小的请求也能完美无缺地工作。

由于

10 个答案:

答案 0 :(得分:11)

您将帖子标记为.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>

答案 1 :(得分:6)

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

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

[ServiceKnownType(typeof(ReturnClass))]

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

Merrick Chaffer's Blog

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

答案 5 :(得分:3)

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

例如:

客户 - &GT; (有) - &gt;评分 Rating-&GT; (属于) - &gt;客户

所以你必须删除周期。

[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 :(得分:3)

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

您可以更改列表&lt;&gt;到DataSet。我怀疑DataSet可以处理比List&lt;&gt;。

更多的数据

希望它有所帮助。

答案 7 :(得分:2)

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

[DataMember]
public bool HasValue
{
    get { return true; }
    set { }//adding this line made the solution.
}

答案 8 :(得分:1)

如果出现内部错误,则会引发一般错误。

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

然后你会看到完整的日志。

答案 9 :(得分:0)

对于使用EF的WCF,只需在上下文类中添加以下代码。

base.Configuration.ProxyCreationEnabled = false;