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
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í.
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.
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 –
Sí, esa es una mejor manera. –
https://msdn.microsoft.com/en-us/library/system.net.webclient.getwebrequest.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 – Ginkgo
- 1. uWSGI keepalive
- 2. WCF wsHttpBinding con http keepalive
- 3. webclient y expect100continue
- 4. Android http solución keepalive, pero ¿es permanente?
- 5. WebClient es muy lento
- 6. HEAD con WebClient?
- 7. Sobrecarga de construcción WebClient
- 8. WebClient ejecuta javascript
- 9. WebClient 403 Prohibido
- 10. C# WebClient con https
- 11. WebClient Unicode - ¿Qué UTF8?
- 12. RestSharp v. WebClient?
- 13. WebClient restful Eliminar
- 14. WebClient + HTTPS Issues
- 15. C# WebClient entrada a accounts.google.com
- 16. C# webclient y servidor proxy
- 17. HTTP persistente/keepalive con la biblioteca PHP Curl?
- 18. Nginx TCP (WebSockets) Tiempo de espera/Keepalive Config
- 19. El uso adecuado de KeepAlive en Apache .htaccess
- 20. ¿Cómo enviar el encabezado KeepAlive correctamente en C#?
- 21. Cómo configurar el tiempo de espera de keepalive en Android?
- 22. Mensaje de error de Meteor: "Error al recibir keepalive! Salir".
- 23. ¿Cómo hacer la solicitud de keepalive http con curl?
- 24. Obtener errores de WebClient como serie
- 25. HttpWebRequest Vs clase webclient que es mejor
- 26. WebClient AsyncUpload siempre devuelve el 50%
- 27. Subir JSON a través de WebClient
- 28. Página de acceso WebClient con credenciales
- 29. C#: Manejo WebClient "violación de protocolo"
- 30. C# WebClient de acción lenta primera vez
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
@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. –
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