¿Puedo reutilizar una HttpWebRequest?

¿Puedo reutilizar una HttpWebRequest?

Parece que la tercera solicitud a un sitio hace que una operación se agote. Parece que cada solicitud crea una nueva conexión, por lo que quiero saber si puedo reutilizar una HttpWebRequest cambiando la url y obteniendo la solicitud nuevamente. El código en cuestión está abajo. Este código verifica si existe un rango de 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(); } 

Deberías estar bien si solo llamas a Close en tu respuesta. Solo se le permiten tantas conexiones “abiertas”, por lo que la razón por la que está fallando es porque no puede abrir una nueva conexión.

Una vez que haya terminado con la respuesta, debe cerrarla … no es necesario reutilizar nada.

Del artículo de MSDN :

Debe llamar al método Stream.Close o HttpWebResponse.Close para cerrar la respuesta y liberar la conexión para su reutilización. No es necesario llamar a Stream.Close y HttpWebResponse.Close, pero al hacerlo no causa un error.

Solo crea uno nuevo. No me preocuparía ser eficiente en este escenario, ya que el .NET environment + HTTP keepalives debería manejar las cosas desde esa perspectiva, creo.

Probablemente te encuentres con 1) un problema con el número de conexiones abiertas; matar la conexión y el error desaparecerá o 2) un problema con límites de número de solicitudes por segundo en el servidor (material anti-DoS). Intenté primero el número 1, ya que es más simple, y luego, si todavía ves el problema, verifica si el servidor recibe la solicitud pero la niega.

Envuelva su llamada de respuesta en una statement de uso para asegurarse de que la conexión esté siempre cerrada:

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

También ajuste cualquier GetResponseStream () en una instrucción de uso.