我有一个肥胖的VB。NET Winform客户端使用旧的asmx样式Web服务。通常,当我执行需要一段时间的查询或将大量数据传递给数据集中的Web服务时,我会得到主题错误。
错误似乎发生在〈1分钟内,这远远小于我设置的Web服务超时值或在Web服务器内执行查询的ADO Command对象上的超时值。
每当我执行一个期望返回大量行的大型查询时,或者当我向Web服务发送大量数据时,似乎都会发生这种情况。例如,当我向Web服务器传递一个大型数据集时,它就发生了:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
--- End of inner exception stack trace ---
at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Smit.Pipeline.Bo.localhost.WsSR.SaveOptions(String emailId, DataSet dsNeighborhood, DataSet dsOption, DataSet dsTaskApplications, DataSet dsCcUsers, DataSet dsDistinctUsers, DataSet dsReferencedApplications) in C:\My\Code\Pipeline2\Smit.Pipeline.Bo\Web References\localhost\Reference.vb:line 944
at Smit.Pipeline.Bo.Options.Save(TaskApplications updatedTaskApplications) in
我一直在寻找关于这个错误的帖子吨,这是令人惊讶的是,如何不同的情况下,导致这个错误是.我试过摆弄Wireshark,但我不知道如何使用它。
这个应用程序在任何时候只有大约20个用户,我能够在半夜重现这个错误,当时可能没有人使用这个应用程序,所以我不认为对Web服务器或数据库的请求数量很高。我可能是唯一的人使用的应用程序现在,我刚刚得到的错误。它似乎必须做的一切与数据量正在传递的任何方向。
8条答案
按热度按时间rbl8hiat1#
查看您客户的应用程序。配置绑定设置,查看是否指定了最大消息大小。默认值为65536
要更改此设置,请将其放入应用的绑定配置中(maxReceivedMessageSize、maxBufferSize和maxArrayLength是此设置的关键属性)。config,或通过更改绑定的属性以编程方式调用,如下所示
如果这不能解决您的问题,您必须检查服务器端的事件日志以获取详细信息。该消息意味着客户端不希望连接关闭,但它确实关闭了,这可能意味着许多不同的事情。
如果可能的话,请使用WCF来实现Web服务。它解决了ASMX服务仍然存在的许多问题。
若要增加服务器端传输限制和执行超时,请使用此
nbnkbykc2#
我也有同样的问题。Web服务调用也会失败,并伴有相同的间歇性异常(~每天一次)。这与数据包大小过大或超时过小无关。
最后我只是把一些重试逻辑,它已经解决了这个问题。参见:How can I improve this exception retry scenario?
bq3bfh9z3#
这段代码为我解决了这个问题:
当我使用
socketsflags
的函数时,服务器/客户端没有再次断开连接。fhity93d4#
如果是ASP。NET尝试在Web中将maxRequestLength设置为更高的值。配置文件
不要将该值增加太多,因为这可能会导致其他错误,如拒绝访问等。如果它是一个数据加载到远程服务器,请尝试将数据切片并发送到块中。
亲切的问候,
马法兹
raogr8fs5#
在我的例子中,我的通用HTTP处理程序(handler。ashx)在尝试从WCF服务检索大文件时遇到意外断开的连接。最后,答案出现在一个微软网页(https://msdn.microsoft.com/en-us/library/ms733742.aspx)和一个打给微软的电话中,微软告诉我,该页面上的一个关键项目拼写错误(应该是“流”而不是“流”)。该页面中更正的代码片段应用于WCF服务的应用程序。配置文件是这样的:
关键是设置传输模式。
smdnsysy6#
试试这个,它为我工作10000通过网络流发送
defendSendBufferSize大于当前TcpClient的设置,或者根据您的系统进行优化,如果没有定义值为8192,则意味着您不能发送超过此值的字节。
**
YourInstantTcpClient**.SendBufferSize = 6550000
对不起,我是泰国人,可能我的英语不好。
jobtbby37#
对于IIS 7(在我的例子中),Web服务的应用程序池的标识是“ApplicationPoolIdentity”。我分配给一个本地用户,它工作得很好。
u7up0aaq8#
好吧,我也犯了同样的错误。但在我的案例中,问题出在AV软件上,它在本地阻止了报告服务。