2011-01-15 14 views
20

Necesito emitir alrededor de 50 solicitudes HTTP a un solo host (llamadas API). El rendimiento es importante, así que me gustaría usar HTTP KeepAlive. ¿WebClient lo admite?¿WebClient usa KeepAlive?

Respuesta

17

Lo hace en mi máquina, pero no puedo ver que es documentado a. Ciertamente lo esperaría por defecto. La forma más simple de decir es ejecutar Wireshark (o Fiddler) y ver exactamente lo que está pasando por el cable.

Por ejemplo, este programa:

using System; 
using System.Net; 

class Test 
{  
    static void Main() 
    { 
     WebClient client = new WebClient(); 
     for (int i = 0; i < 50; i++) 
     { 
      string text = client.DownloadString("http://www.microsoft.com"); 
      Console.WriteLine(text.Length); 
     } 
    } 
} 

genera una primera petición de:

GET/HTTP/1.1 
Host: www.microsoft.com  
Connection: Keep-Alive 

solicitudes subsecuencia son:

GET/HTTP/1.1 
Host: www.microsoft.com 

... presumiblemente porque una vez que una conexión está en modo KeepAlive, se supone que seguirá siendo así.

+0

He notado un comportamiento extraño al usar UploadData, por alguna razón, los encabezados del cliente se restablecen cuando se devuelven los bytes de respuesta. – Oliver

+0

@Oliver: No está muy claro qué quiere decir con eso, pero si es algo que le causa problemas, es posible que desee formular una nueva pregunta. –

+0

No es realmente un problema, solo pensé en poner una nota sobre algún comportamiento que había visto. El comportamiento es el siguiente. Crear WebClient -> Agregar encabezados al diccionario -> Hacer que UploadData llame -> Los encabezados estarán vacíos, parece que se los deshabilitará por algún motivo. – Oliver

14

Como se documenta aquí, WebClient hace uso de WebRequest en su implementación privada, http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx. Microsoft no expone eso como una propiedad pública para que usted pueda controlar.

Por lo tanto, al revisar su implementación mediante Reflector, puede ver cómo se configura KeepAlive para el objeto WebRequest en uso. Como señaló @Jon, un experimento muestra que KeepAlive está establecido en verdadero. Esto también coincide con otros escenarios, como la implementación privada de .NET Remoting.

En casos excepcionales, es posible que KeepAlive = true pueda conducir a SocketException, y luego tiene que usar la reflexión u otros trucos para configurarlo en falso, lo que es muy molesto.

+15

No necesita usar el reflejo, solo puede heredar, anular GetWebRequest() y establecer algunas propiedades en WebRequest después de llamar a base.GetWebRequest() en el método reemplazado –

+1

Sí, esa es una mejor manera. –

+1

https://msdn.microsoft.com/en-us/library/system.net.webclient.getwebrequest.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 – Ginkgo