2010-02-01 10 views
19

Sono in grado di riutilizzare un HttpWebRequest?Sono in grado di riutilizzare un HttpWebRequest?

Sembra che la terza richiesta di un sito causi il timeout di un'operazione. Sembra che ogni richiesta crei una nuova connessione, quindi voglio sapere se posso riutilizzare una HttpWebRequest cambiando l'url e ricevendo di nuovo la richiesta. Il codice in questione è sotto. Questo codice controlla se esiste un intervallo di URL.

static void storeList(TextWriter sw, string urlTemplate, int start, int end) 
    { 
     for (int i = start; i < end; i++) 
     { 
      var url = string.Format(urlTemplate, i); 
      var req = (HttpWebRequest)HttpWebRequest.Create(url); 
      { 
       req.Method = "HEAD"; 
       tryHttpWebRequest 
       { 
        var resp = req.GetResponse(); 
        sw.WriteLine(i); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 
     sw.Flush(); 
    } 
+1

Non si riutilizza il proprio 'HttpWebRequest' nel codice di esempio - ne si crea uno nuovo ogni volta intorno al ciclo' for'. – adrianbanks

+0

Lo so, quindi la domanda, come posso riutilizzare? ;) –

+0

Ah, ok. Ho pensato che stavi cercando di dimostrare che stavi riutilizzando la richiesta ma non funzionava. – adrianbanks

risposta

13

Si dovrebbe essere ok se si chiama Chiudi sulla risposta. Sono consentite solo così tante connessioni "aperte", quindi il motivo per cui non funziona è perché non può aprire una nuova connessione.

Una volta terminata la risposta, è necessario chiuderla ... non è necessario riutilizzare nulla.

Dal MSDN article:

È necessario chiamare sia lo Stream.Close o il metodo HttpWebResponse.Close al chiudere la risposta e rilasciare il collegamento per il riutilizzo. Non è necessario chiamare sia Stream.Close e HttpWebResponse.Close, ma facendo quindi non provoca un errore.

+5

@acid & josh - l'implicazione di questo post è che se la risposta restituita da (Begin) GetResponse può essere chiusa e la richiesta può essere riutilizzata ma i test non la supportano. Se potessi pubblicare un codice per chiarire esattamente quale domanda stai rispondendo sarebbe grandioso. –

2

Basta crearne uno nuovo. Non mi preoccuperei di essere efficiente in questo scenario, in quanto l'ambiente .NET + keepalive HTTP dovrebbe gestire le cose per voi da quella prospettiva, credo.

Probabilmente si sta eseguendo o 1) un problema con il numero di connessioni aperte; uccidere la connessione e l'errore andrà via oppure 2) un problema con limiti di numero di richieste al secondo sul server (roba anti-DoS). Per prima cosa proverei il n. 1, in quanto è più semplice, e poi se vedi ancora il problema, controlla se il server sta ricevendo la richiesta ma la neghi.

2

avvolgere la chiamata risposta in un'istruzione using per assicurarsi che la connessione sia sempre chiuso:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url) 
// ... 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    // ... 
} 

avvolgere Anche qualsiasi GetResponseStream() in un'istruzione using.

+0

La risposta IIRC non ha IDispose. L'ho provato prima di postare la domanda. La soluzione era usare .close alla fine di ogni ciclo –

+0

@ acidzombie24, 'HttpWebResponse: WebResponse: IDisposable', [e ha fatto da .NET 1.1] (https://msdn.microsoft.com/en-us/library/ system.net.webresponse% 28V = vs.71% 29.aspx). –

Problemi correlati