c# - ¿WebClient utiliza KeepAlive?
.net keep-alive (2)
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 soporta esto?
Como se documenta aquí, WebClient usa WebRequest en su implementación privada, http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx . Microsoft no lo expone como una propiedad pública para que usted la controle.
Por lo tanto, al revisar su implementación utilizando Reflector, puede ver cómo KeepAlive está configurado para el objeto WebRequest en uso. Como señaló @Jon, un experimento muestra que KeepAlive está configurado como verdadero. Esto coincide con otros escenarios también, como la implementación privada de .NET remoting.
En casos excepcionales, puede encontrar que KeepAlive = true puede llevar a SocketException, y luego tiene que usar la reflexión u otros trucos para establecerlo en false, lo cual es muy molesto.
Lo hace en mi máquina, pero no puedo ver que esté documentado . Sin duda esperaría que por defecto. La forma más sencilla de saberlo es ejecutar Wireshark (o Fiddler) y ver exactamente qué es lo que sucede.
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 solicitud de:
GET / HTTP/1.1
Host: www.microsoft.com
Connection: Keep-Alive
Las solicitudes de subsistencia son solo:
GET / HTTP/1.1
Host: www.microsoft.com
... presumiblemente porque una vez que la conexión está en modo KeepAlive, se asume que seguirá siendo así.