Vb.net 远程主机已强制关闭现有连接

Vb.net 远程主机已强制关闭现有连接,vb.net,web-services,asmx,Vb.net,Web Services,Asmx,我有一个胖的VB.NET Winform客户端,它使用的是旧的asmx样式的web服务。通常,当我执行需要一段时间的查询或将大量数据传递给数据集中的web服务时,会出现主题错误 错误似乎发生在

我有一个胖的VB.NET Winform客户端,它使用的是旧的asmx样式的web服务。通常,当我执行需要一段时间的查询或将大量数据传递给数据集中的web服务时,会出现主题错误

错误似乎发生在<1分钟内,这远远小于我设置的web服务超时值或在web服务器内执行查询的ADO命令对象上的超时值

每当我执行一个需要返回很多行的大型查询时,或者当我向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服务器或数据库请求的数量是高的。我可能是目前唯一一个使用该应用程序的人,而我现在刚刚发现了错误。它似乎必须处理任何一个方向上传递的数据量


这个错误真的是慢性病,要了我的命。请提供帮助。

检查客户端的app.config绑定设置,查看是否指定了最大消息大小。默认值为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> 

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

我最后只是加入了一些重试逻辑,解决了这个问题。
请参阅:

试试这个,它对通过网络流发送的10000个邮件有效

定义大于当前TCP客户端设置或优化系统的SendBufferSize 如果未定义,则值为8192,这意味着您不能发送超过此值的字节

**
YourInstantTcpClient**.SendBufferSize=6550000


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

此代码为我解决了问题:

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

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

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

<httpRuntime maxRequestLength="65536"/>

不要将该值增加太多,因为它可能会导致其他错误,如拒绝访问等。 如果是数据上传到远程服务器,请尝试将数据切片并分块发送

亲切问候,


Mafaz

对于IIS 7(在我的例子中),Web服务的应用程序池的标识是“ApplicationPoolIdentity”。我分配给一个本地用户,效果很好

好吧,我也犯了同样的错误。但在我的例子中,问题出在AV软件中,它在本地阻止了reporting services。

在我的例子中,我的通用HTTP处理程序(handler.ashx)在尝试从WCF服务检索大文件时遇到意外断开的连接。最后,一个Microsoft网页()和一个给Microsoft的电话给出了答案,Microsoft告诉我该网页上的一个关键项目拼写错误(应该是“流”而不是“流”)。该页面中应用于我的WCF服务的app.config文件的更正代码段如下:

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

...
...

关键是设置传输模式。

web服务器端发生了什么?您在日志中看到任何消息吗?请发布完整的异常。捕获异常,然后发布
ex.ToString()
的结果。这不是消息的大小,尽管这是一个很好的猜测。我知道这一点,因为我在调试模式下遇到了错误,然后再次按照相同的查询路径重置执行,第二次运行正常。执行的查询应该是完全相同的查询。当我尝试捕获更多错误信息时,我也看到了此错误:无法从transport ConnectionTransage读取数据,但可能与消息大小或执行超时有关。第一次发送的消息是否可能比第二次发送的消息大?您是否了解“无法读取数据”消息的详细信息?检查您的web.config,并尝试在我的编辑中包含代码,以将消息大小增加到400MB,并设置5分钟超时。虽然有时会出现错误,有时不会,但我不相信返回的数据大小已更改。我有99.99%的把握。我正在运行一个由一个非常小的小组使用的应用程序,我在凌晨3点进行测试。我现在看到的“无法读取数据”消息也在我的原始错误消息中。如果我读对了,那不是第一次遇到的底层内部错误,而是“强制关闭”错误。我确实做了你推荐的web配置更改,但是没有任何帮助。当然,投票支持有用的建议,但仍然没有解决方案。:-)我要重游一个真实的世界。我想在与微软技术支持人员交谈后,我会提供多年前的更新。他们告诉我有什么东西(可以