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