底层连接被关闭:连接被意外关闭
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请求错误,基础连接已经关闭: 连接被意外关闭