Pergunta

Temos um aplicativo Web ASP.NET em execução no IIS que usa a classe SoAPHTTPClientProtocol para fazer chamadas de sabão. Nos últimos dias, várias máquinas XP começaram a relatar erros de tempo limite ao fazer chamadas de serviços de sabão.

Stack rastrear de um aplicativo de teste:

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

Usando TCP/ Trace e Wireshark, podemos ver que o cabeçalho da solicitação está sendo enviado, mas não o conteúdo. No entanto, o parâmetro HTTP de comprimento de conteúdo está correto, é quase como se o fluxo de conteúdo não tivesse sido liberado.

Suspeitamos que uma atualização da Microsoft tenha causado esse problema. Potencialmente KB970430, KB971737 e KB968389. O problema parece estar isolado no IIS 5.x (versão XP do IIS).

Foi útil?

Solução

ATUALIZAR: Isso acabou sendo um problema com o antivírus ESET em execução no servidor da Web e executando a verificação on-the-fly de conexões HTTP do servidor da Web para um servidor SOAP.

Descrição completa: Para o registro, este é um defeito no manuseio do protocolo HTTP no .NET. O cenário é o seguinte:

O cliente envia o cabeçalho da postagem HTTP:

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

O conteúdo não é enviado por causa da esperança: 100-Continue. O servidor agora responde:

HTTP/1.1 100 Continue

Neste ponto, o cliente não responde. Uma solução alternativa para isso é desativar os 100 contínuos que forçam essencialmente o cabeçalho e o conteúdo da solicitação a serem enviados em um pedaço. Isso pode ser feito no web.config com:

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

No entanto, se também ativarmos o log de rastreamento do lado do cliente, será lançado uma exceção de protocolo, afirmando que a CR deve ser seguida por LF nos cabeçalhos HTTP. Parece haver algum código frágil na lógica da rede .NET em algum lugar. E para recapitular, isso é apenas um problema com o ASP.NET no IIS 5.1 (a versão executada no XP).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top