Domanda

Disponiamo di un'applicazione Web ASP.NET in esecuzione in IIS che utilizza la classe SoapHttpClientProtocol per effettuare chiamate SOAP.Negli ultimi giorni diverse macchine XP hanno iniziato a segnalare errori di timeout durante le chiamate ai servizi SOAP.

Stack Trace da un'app di prova:

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

Utilizzando TCP/Trace e Wireshark possiamo vedere che viene inviata l'intestazione della richiesta ma non il contenuto.Tuttavia, il parametro HTTP content-length è corretto, è quasi come se il flusso di contenuto non fosse stato svuotato.

Sospettiamo che questo problema sia stato causato da un aggiornamento Microsoft.Potenzialmente KB970430, KB971737 E KB968389.Il problema sembra essere isolato in IIS 5.x (versione XP di IIS).

È stato utile?

Soluzione

AGGIORNAMENTO:Questo si è rivelato essere un problema con l'antivirus ESET in esecuzione sul server Web e che eseguiva il controllo immediato delle connessioni HTTP dal server Web a un server SOAP.

Descrizione completa:Per la cronaca si tratta di un difetto nella gestione del protocollo HTTP in .NET.Lo scenario è il seguente:

Il client invia l'intestazione di 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

Il contenuto non viene inviato a causa di Expect:100-Continua.Il server ora risponde:

HTTP/1.1 100 Continue

A questo punto il client non risponde.Una soluzione alternativa a questo problema è disabilitare il 100-continue che essenzialmente forza l'invio dell'intestazione e del contenuto della richiesta in un unico blocco.Questo può essere fatto nel web.config con:

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

Tuttavia, se attiviamo anche la registrazione della traccia lato client, viene generata un'eccezione di protocollo che indica che CR deve essere seguito da LF nelle intestazioni HTTP.Sembra che ci sia del codice fragile nella logica della rete .Net da qualche parte.E per ricapitolare questo è solo un problema con ASP.NET in IIS 5.1 (la versione che funziona su XP).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top