Вопрос

У нас есть веб-приложение ASP.NET, работающее в IIS, которое использует класс SoapHttpClientProtocol для выполнения вызовов SOAP.За последние несколько дней несколько компьютеров XP начали сообщать об ошибках тайм-аута при вызовах служб SOAP.

Трассировка стека из тестового приложения:

System.Net.WebException: The operation has timed out
   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 TestWS.localhost.Service1.HelloWorld() in C:\Prototypes\TestWS\Web References\localhost\Reference.cs:line 78
   at ASP.default_aspx.__Renderform1(HtmlTextWriter __w, Control parameterContainer) in c:\Inetpub\wwwroot\TestWS\Default.aspx:line 17

Используя TCP/Trace и Wireshark, мы видим, что отправляется заголовок запроса, но не его содержимое.Однако HTTP-параметр длины контента правильный, это почти как если бы поток контента не был сброшен.

Мы подозреваем, что эта проблема вызвана обновлением Microsoft.Потенциально КБ970430, КБ971737 и КБ968389.Проблема, по-видимому, относится только к IIS 5.x (версия IIS для XP).

Это было полезно?

Решение

ОБНОВЛЯТЬ:Оказалось, что это проблема с антивирусом ESET, работающим на веб-сервере и выполняющим оперативную проверку HTTP-соединений от веб-сервера к серверу SOAP.

Полное описание:Для справки, это дефект обработки протокола HTTP в .NET.Сценарий следующий:

Клиент отправляет заголовок HTTP POST:

POST /WS/Test.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603) 
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://testuri.org/HelloWorld"
Host: loadtest-app
Content-Length: 288
Expect: 100-continue
Connection: Keep-Alive

Содержимое не отправляется из-за Ожидания:100-Продолжить.Теперь сервер отвечает:

HTTP/1.1 100 Continue

На данный момент клиент не отвечает.Обходной путь — отключить 100-continue, что по сути заставляет заголовок запроса и содержимое отправляться одним куском.Это можно сделать в web.config с помощью:

<system.net>
   <settings>
      <servicePointManager expect100Continue="false"/>
   </settings>
</system.net>

Однако если мы также включим ведение журнала трассировки на стороне клиента, будет выдано исключение протокола, указывающее, что за CR в заголовках HTTP должен следовать LF.Кажется, где-то в сетевой логике .Net есть какой-то хрупкий код.Напомним, что это проблема только ASP.NET в IIS 5.1 (версия, работающая на XP).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top