¡HttpWebRequest es extremadamente lento!

Estoy usando una biblioteca de código abierto para conectarme a mi servidor web. Me preocupaba que el servidor web fuera extremadamente lento y luego intenté hacer una prueba simple en Ruby y obtuve estos resultados

Progtwig Ruby: 2.11 segundos para 10 HTTP GET

Progtwig Ruby: 18.13 segundos para 100 HTTP GET

Biblioteca C #: 20.81 segundos para 10 HTTP GET

Biblioteca C #: 36847.46segundos para 100 HTTP GET

He perfilado y encontré que el problema es esta función:

private HttpWebResponse GetRawResponse(HttpWebRequest request) { HttpWebResponse raw = null; try { raw = (HttpWebResponse)request.GetResponse(); //This line! } catch (WebException ex) { if (ex.Response is HttpWebResponse) { raw = ex.Response as HttpWebResponse; } } return raw; } 

La línea marcada toma más de 1 segundo para completarse por sí misma, mientras que el progtwig de Ruby que hace 1 solicitud toma .3 segundos. También estoy haciendo todas estas pruebas en 127.0.0.1, por lo que el ancho de banda de la red no es un problema.

¿Qué podría estar causando esta gran ralentización?

ACTUALIZAR

Verifique los resultados del benchmark modificado. De hecho, probé con 10 GET y no con 100, actualicé los resultados.

Lo que he encontrado que es el principal culpable de las solicitudes web lentas es la propiedad proxy. Si establece esta propiedad en nulo antes de llamar al método GetResponse, la consulta omitirá el paso de autodetección del proxy:

 request.Proxy = null; using (var response = (HttpWebResponse)request.GetResponse()) { } 

La autodetección de proxy tardaba hasta 7 segundos en realizar una consulta antes de devolver la respuesta. Es un poco molesto que esta propiedad esté activada por defecto para el objeto HttpWebRequest.

Puede tener que ver con el hecho de que estás abriendo varias conexiones a la vez. Por defecto, la cantidad máxima de conexiones HTTP abiertas se establece en dos. Intente agregar esto a su archivo .config y vea si ayuda:

  .......     

Estaba teniendo un problema similar con un proyecto VB.Net MVC.
Localmente en mi pc (Windows 7) tardaba menos de 1 segundo en llegar a las solicitudes de página, pero en el servidor (Windows Server 2008 R2) tardaba más de 20 segundos para cada solicitud de página.

Intenté una combinación de configurar el proxy para nulo

  System.Net.WebRequest.DefaultWebProxy = Nothing request.Proxy = System.Net.WebRequest.DefaultWebProxy 

Y cambiando el archivo de configuración agregando

   .......     

Esto aún no redujo los tiempos de solicitud de página lenta en el servidor. Al final, la solución fue desmarcar la opción “Detectar configuraciones automáticamente” en las opciones de IE en el servidor. (En Herramientas -> Opciones de Internet, seleccione la pestaña Conexiones. Presione el botón Configuración de LAN)

Inmediatamente después de desmarcar esta opción del navegador en el servidor, todos los tiempos de solicitud de página cayeron de más de 20 segundos a menos de 1 segundo.

Comencé a observar una desaceleración similar a la OP en esta área, que mejoró un poco al boost las MaxConnections.

 ServicePointManager.DefaultConnectionLimit = 4; 

Pero después de construir este número de WebRequests, las demoras volvieron.

El problema, en mi caso, fue que estaba llamando a un POST y no me molesté con la respuesta, así que no estaba retomando ni haciendo nada con eso. Desafortunadamente, esto dejó a la WebRequest flotando hasta que se agotó el tiempo de espera.

La solución fue recoger la respuesta y simplemente cerrarla.

 WebRequest webRequest = WebRequest.Create(sURL); webRequest.Method = "POST"; webRequest.ContentLength = byteDataGZ.Length; webRequest.Proxy = null; using (var requestStream = webRequest.GetRequestStream()) { requestStream.WriteTimeout = 500; requestStream.Write(byteDataGZ, 0, byteDataGZ.Length); requestStream.Close(); } // Get the response so that we don't leave this request hanging around WebResponse response = webRequest.GetResponse(); response.Close(); 

Use una computadora que no sea localhost , luego use WireShark para ver qué pasa realmente por el cable.

Como han dicho otros, puede tratarse de varias cosas. Mirar cosas en el nivel de TCP debería dar una imagen clara.

No sé cómo he llegado exactamente a esta solución, no tenía tiempo para investigar, así que depende de ustedes. Hay un parámetro y lo he usado así (en el constructor de mi clase, antes de crear una instancia del objeto HTTPWebRequest):

 System.Net.ServicePointManager.Expect100Continue = false; 

No sé por qué exactamente, pero ahora mis llamadas parecen bastante más rápidas.

Sé que este es un hilo viejo, pero he perdido todo el día con la lenta HttpWebRequest, probé todas las soluciones sin suerte. Cada solicitud para cualquier dirección fue más de un minuto.

Finalmente, el problema fue con mi Antivirus Firewall (Eset) . Estoy usando firewall con modo interactivo, pero Eset de alguna manera se apagó por completo. Eso causó que la solicitud dure para siempre. Después de encender el Eset y de ejecutar la solicitud, se muestra el mensaje del cortafuegos, y después de la confirmación, solicita que se ejecute durante menos de un segundo .

Probé todas las soluciones descritas aquí sin suerte, la llamada duró unos 5 minutos.

Cuál fue el problema: necesitaba la misma sesión y obviamente las mismas cookies (solicitud hecha en el mismo servidor), así que recreé las cookies de Request.Cookies en WebRequest.CookieContainer . El tiempo de respuesta fue de aproximadamente 5 minutos.

Mi solución: Comentó el código relacionado con cookies y ¡bam! La llamada tomó menos de un segundo.

Para mí, el problema fue que había instalado LogMeIn Hamachi, irónicamente para depurar remotamente el mismo progtwig que luego comenzó a exhibir esta extrema lentitud.

Para su información, desactivar el adaptador de red Hamachi no fue suficiente porque parece que su servicio de Windows vuelve a habilitar el adaptador.

Además, volver a conectarme a mi red Hamachi no resolvió el problema. Solo la desactivación del adaptador (mediante la desactivación del servicio LogMeIn Hamachi Windows) o, presumiblemente, la desinstalación de Hamachi, me solucionó el problema.

¿Es posible solicitar a HttpWebRequest que salga a través de un adaptador de red específico?

Tuvimos el mismo problema en la aplicación web. Esperamos en respuesta 5 segundos. Cuando cambiamos el usuario en applicationPool en IIS a networkService, la respuesta comenzó a llegar menos de 1 segundo