2010-02-12 23 views
9

Dopo aver cercato su Google per un paio di giorni, non riesco davvero a risolvere il problema descritto. Spero che qui trovi una soluzioneGetRequestStream genera un'eccezione Timeout in modo casuale

Sto usando il codice allegato quando chiami il servizio WCF sullo stesso server. Ottengo l'errore di timeout in modo casuale a chiamata WebReq.GetRequestStream()

Quando sono assegno netstat vedo che la connessione rimane aperta, quindi probabilmente c'è un problema, ma non so come risolverlo

 //request inicialization 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url); 
     WebReq.Method = "POST"; 
     WebReq.ContentType = "application/json; charset=utf-8"; 
     WebReq.ContentLength = buffer.Length; 

     WebReq.Proxy = null; 
     WebReq.KeepAlive = false; //also tried with true 
     WebReq.AllowWriteStreamBuffering = false; //also tried with true 

     //this produces an error 
     using (Stream PostData = WebReq.GetRequestStream()) 
     { 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 
     } 

     //open and read response 
     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     Stream Answer = WebResp.GetResponseStream(); 
     StreamReader _Answer = new StreamReader(Answer); 

     WebResp.Close(); 

     //return string 
     return _Answer.ReadToEnd(); 

Il timeout viene generato principalmente dopo circa 10 secondi di inattività, ma anche dopo cinque o più richieste nella riga. Non riesco davvero a trovare un modello.

Cosa potrebbe essere sbagliato con questo codice? C'è un altro (migliore) modo per chiamare il servizio WCF?

risposta

12

Non so che sia sicuramente responsabile del problema, ma stai solo chiudendo la risposta web se non genera un'eccezione e non stai mai chiudendo il flusso di risposta. Utilizzare using dichiarazioni:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    return reader.ReadToEnd(); 
} 

Questo potrebbe spiegare il problema, come se si lascia una risposta aprirlo manterrà la connessione al server web aperto - il che significa che il pool di connessioni, allora non è possibile utilizzare tale connessione.

+0

È un po 'meglio, ma sto ancora ricevendo un timeout. Quindi, è davvero strano. Quindi, dopo il primo clic del collegamento, si sta caricando e caricando e se in quel momento si fa clic sullo stesso o su qualsiasi altro collegamento sulla pagina, la pagina viene caricata nel secondo o giù di lì. Quindi c'è qualcosa di sbagliato nella creazione di Connection. Come suppongo che – AnzeR

+0

non avessi notato che si trovava sulla stessa macchina ... Mi chiedo se sei a corto di thread di thread thread - sono all'interno dello stesso processo? –

+0

Sono abbastanza nuovo nella programmazione .net. Sono programmato in PHP da alcuni anni e non si notano mai problemi del genere. Ci sono cose molto più semplici. Quindi non sono sicuro di cosa intendessi con "thread di thread fuori dal thread"? Con una richiesta creo due o così questa richiesta HTTP al servizio WCF, quindi è in corso con lo stesso processo/richiesta. Dovrei usare la cache per queste richieste? – AnzeR

0

Poiché si tratta di un comportamento davvero strano, vorrei sapere se esistono altri modi per chiamare il servizio WCF, ospitato sullo stesso server IIS. Inoltre, la creazione di connessioni TCP per questo tipo di chiamate non è ottimizzata e tutti gli altri approcci dovrebbero essere molto più veloci.

6

Ho avuto lo stesso problema, aggiungendo una chiamata a HttpWebRequest.Abort() sembrava risolvere il problema.

+0

Grazie! Mi ha aiutato a risolvere il mio problema. connessioni correttamente;) – pila

0

La prima cosa da tenere a mente è quello di rivedere i parametri URI, e le intestazioni di essere inviato, in particolare:

  • caratteri riservati. Invia caratteri riservati dal URI può portare problemi ! * ' () ; : @ & = + $ ,/? # []
  • URI Lunghezza: Si consiglia di non superare i 2000 caratteri
  • intestazioni Lunghezza: La maggior parte dei server web fanno dimensione limite intestazioni che accettano. Ad esempio, nel limite predefinito di Apache è 8 KB.

Tenere presente che se si desidera inviare dati da una lunghezza maggiore si consiglia di inviare il corpo del messaggio.

Problemi correlati