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

sbdsn5lh  于 2023-05-01  发布在  其他
关注(0)|答案(8)|浏览(312)

我有一个肥胖的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服务器或数据库的请求数量很高。我可能是唯一的人使用的应用程序现在,我刚刚得到的错误。它似乎必须做的一切与数据量正在传递的任何方向。

rbl8hiat

rbl8hiat1#

查看您客户的应用程序。配置绑定设置,查看是否指定了最大消息大小。默认值为65536
要更改此设置,请将其放入应用的绑定配置中(maxReceivedMessageSize、maxBufferSize和maxArrayLength是此设置的关键属性)。config,或通过更改绑定的属性以编程方式调用,如下所示

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>
nbnkbykc

nbnkbykc2#

我也有同样的问题。Web服务调用也会失败,并伴有相同的间歇性异常(~每天一次)。这与数据包大小过大或超时过小无关。
最后我只是把一些重试逻辑,它已经解决了这个问题。参见:How can I improve this exception retry scenario?

bq3bfh9z

bq3bfh9z3#

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

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

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

fhity93d

fhity93d4#

如果是ASP。NET尝试在Web中将maxRequestLength设置为更高的值。配置文件

<httpRuntime maxRequestLength="65536"/>

不要将该值增加太多,因为这可能会导致其他错误,如拒绝访问等。如果它是一个数据加载到远程服务器,请尝试将数据切片并发送到块中。
亲切的问候,
马法兹

raogr8fs

raogr8fs5#

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

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

关键是设置传输模式。

smdnsysy

smdnsysy6#

试试这个,它为我工作10000通过网络流发送
defendSendBufferSize大于当前TcpClient的设置,或者根据您的系统进行优化,如果没有定义值为8192,则意味着您不能发送超过此值的字节。

**YourInstantTcpClient**.SendBufferSize = 6550000

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

jobtbby3

jobtbby37#

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

u7up0aaq

u7up0aaq8#

好吧,我也犯了同样的错误。但在我的案例中,问题出在AV软件上,它在本地阻止了报告服务。

相关问题