远程主机强制关闭现有连接

时间:2010-05-19 04:15:37

标签: vb.net web-services asmx

我有一个胖的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 个答案:

答案 0 :(得分:2)

检查客户端的app.config绑定设置,看看是否指定了Max消息大小。默认值为65536

要更改此设置,请在app.config中将其置于绑定配置(maxReceivedMessageSize,maxBufferSize和maxArrayLength是此类的关键属性)中,或者通过更改绑定的属性以编程方式进行更改

System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();

// if you are getting a LOT of data back, you will need to up Message Size
binding.MaxReceivedMessageSize = int.MaxValue; 

如果这不能解决您的问题,则必须检查服务器端的事件日志以获取详细信息。该消息意味着客户端并不希望连接关闭,但确实如此,这可能意味着许多不同的事情。

如果可能,请使用WCF进行Web服务。它解决了ASMX服务仍然存在的许多问题。

要增加服务器端传输限制和执行超时,请使用此

<configuration>
  <system.web> 
    <httpRuntime maxMessageLength="409600" executionTimeoutInSeconds="300"/> 
  </system.web>
</configuration> 

答案 1 :(得分:2)

我遇到了完全相同的问题。 Web服务调用将失败并出现相同的间歇性异常(〜每天一次)。它与太大的数据包大小或太小的超时无关。

我最后只是提出了一些解决问题的重试逻辑。 请参阅:How can I improve this exception retry scenario?

答案 2 :(得分:2)

此代码为我解决了这个问题:

Socket.ReceiveFrom(Buffer, Net.Sockets.SocketFlags.None, ReceiveEndpoint)
Socket.SendTo(Buffer, Length, Net.Sockets.SocketFlags.None, ReceiveEndpoint)

当我使用socketsflags函数时,服务器/客户端没有再次断开连接。

答案 3 :(得分:1)

如果是ASP.NET,请尝试在web.config文件中将maxRequestLength设置为更高的值

<httpRuntime maxRequestLength="65536"/>

不要过多地增加该值,因为它可能会导致其他错误,如访问拒绝等。 如果它是远程服务器的dataupload,请尝试切片数据并以块的形式发送。

亲切的问候,

Mafaz

答案 4 :(得分:1)

在我的情况下,我的通用HTTP处理程序(handler.ashx)在尝试从WCF服务检索大文件时遇到意外断开的连接。最后,答案出现在一个微软网页(https://msdn.microsoft.com/en-us/library/ms733742.aspx)和一个微软的电话中,微软告诉我该页面上的一个关键项目拼写错误(应该是“流式”而不是“流媒体”) 。该页面中已更正的代码段应用于我的WCF服务的app.config文件:

<system.serviceModel>
<bindings>
    ...
    <basicHttpBinding>
    <binding name="ExampleBinding" transferMode="Streamed"/>
        </basicHttpBinding>
    </bindings>
    ...
<system.serviceModel>

关键是设置传输模式。

答案 5 :(得分:0)

尝试这个,它适用于我通过网络流发送的10000

定义 SendBufferSize ,而不是设置当前的TcpClient或优化到您的系统 如果没有定义该值是8192,那意味着你不能发送比这更多的字节。

** YourInstantTcpClient**.SendBufferSize = 6550000

对不起,我是泰国人,可能我的英语不好。

答案 6 :(得分:0)

对于IIS 7(在我的例子中),webservice的应用程序池的标识是“ApplicationPoolIdentity”。我分配给本地用户,它工作得很好。

答案 7 :(得分:0)

好的,我得到了同样的错误。但就我而言,问题出在AV软件上,它阻止了本地的报告服务。