Существующее соединение было насильственно закрыто удаленным хостом

У меня есть толстый VB.NET клиент Winform, который использует, старый asmx разрабатывает веб-сервис. Очень часто, когда я выполняю запрос, который требует времени, или передайте большое количество данных к веб-сервису в наборе данных, я получаю подчиненную ошибку.

Ошибка, кажется, происходит в <1 минута, которая является намного меньше, чем значение тайм-аута веб-сервиса, которое я установил или значение тайм-аута на Объекте команды ADO, который выполняет запрос в веб-сервере.

Это, кажется, происходит каждый раз, когда я выполняю выполнение больших запросов, которое ожидает возвращать много строк или когда я повышу большой объем данных к веб-сервису. Например, просто произошло, когда я передавал большой набор данных веб-серверу:

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 пользователей в любой момент, и я могу воспроизвести эту ошибку в середине ночи, когда, вероятно, никто не использует приложение, таким образом, я не думаю, что количество запросов к веб-серверу или к базе данных высоко. Я - вероятно, единственный человек, использующий приложение прямо сейчас, и я просто получил ошибку теперь. Это, кажется, должно сделать все с количеством данных, передаваемых в любом направлении.

Эта ошибка является действительно хронической и уничтожает меня. Помогите.

9
задан ChadD 19 May 2010 в 04:15
поделиться

1 ответ

Проверьте настройку привязки app.config вашего клиента и убедитесь, что вы указали максимальный размер сообщения. Значение по умолчанию для этого - 65536

. Чтобы изменить это, либо поместите его в свою конфигурацию привязки (maxReceivedMessageSize, maxBufferSize и maxArrayLength являются ключевыми свойствами для этого) в вашем app.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 для веб-служб. Это решает множество проблем, от которых до сих пор страдают службы ASMX.

Чтобы увеличить предел передачи на стороне сервера и тайм-аут выполнения, используйте этот

<configuration>
  <system.web> 
    <httpRuntime maxMessageLength="409600" executionTimeoutInSeconds="300"/> 
  </system.web>
</configuration> 
2
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: