¿Por qué mejora el rendimiento del objeto HttpWebRequest mientras se usa Fiddler?

StackOverflow https://stackoverflow.com/questions/1022844

  •  06-07-2019
  •  | 
  •  

Pregunta

Tengo un comportamiento muy extraño con HttpWebRequest. Espero que alguien pueda ayudarme. Tengo una aplicación de consola que realiza algunos trabajos de agregación mediante el uso del objeto HttpWebRequest para recuperar el contenido de un sitio web de destino. Debido a la naturaleza del requisito, la aplicación es multiproceso e intenta realizar entre 10 y 30 conexiones simultáneas (he estado experimentando con un rango de valores). La solicitud web real se estructura de la siguiente manera:

var req = (HttpWebRequest)WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();
var sr = new StreamReader(s, Encoding.ASCII);
string doc = sr.ReadToEnd();
sr.Close();
resp.Close();
return doc;

De todos modos, el comportamiento extraño es que, en circunstancias normales, la aplicación está logrando alrededor de 120 solicitudes por minuto, pero si abro Fiddler, salta a alrededor de 600. Usando Windows 7 Resource Monitor puedo ver que la actividad de la red aumenta en consecuencia. Las conexiones TCP para el proceso de la consola ahora muestran la dirección remota como " IPv4 loopback " en lugar de la dirección IP del servidor de destino (esperado). Me preguntaba sobre el número máximo de solicitudes HTTP simultáneas permitidas por la máquina, pero cambiar esto en el registro no parece hacer la diferencia.

Entonces la pregunta es; ¿De qué se trata ejecutar Fiddler que de repente aumenta el rendimiento cinco veces y cómo puedo lograrlo de forma nativa en la máquina sin necesidad de lanzar otra herramienta?

¡Gracias!

¿Fue útil?

Solución

Parece que ahora he podido aumentar el rendimiento (para duplicar lo que estaba obteniendo con Fiddler abierto en realidad) configurando las conexiones máximas en la App.config:

<system.net>
  <connectionManagement>
    <add address="*" maxconnection="30" />
  </connectionManagement>
</system.net>

Muy contento con el resultado, pero todavía estoy un poco desconcertado sobre por qué tener Fiddler abierto cambió los resultados tan dramáticamente.

Otros consejos

Una cosa que noté de inmediato es que no está implementando el uso de bloques. Eso agrega un factor de aleatoriedad que podría multiplicarse por el número de solicitudes, por lo que le sugiero que arregle eso:

var req = WebRequest.Create(url);
using (WebResponse resp = req.GetResponse())
{
    using (Stream s = resp.GetResponseStream())
    {
        using (var sr = new StreamReader(s, Encoding.ASCII))
        {
            return sr.ReadToEnd();
        }
    }
}

A continuación, para su información, Fiddler actúa como un proxy. Si su proxy predeterminado se configuró para usar un script para configurar la configuración del proxy, entonces me pregunto si tener Fiddler ejecutándose podría no eliminar el tiempo necesario para realizar la configuración del script. Eso podría suceder solo una vez, en lugar de en cada solicitud.

Tuve un problema similar al tuyo y quería compartir mi resolución.

En resumen, tenía un programa de consola que hacía solicitudes HTTP y, después de 15 minutos más o menos, agotaba el tiempo de espera. Sin embargo, si utilicé Fiddler, nunca tuve tiempos de espera, incluso después de haberlo ejecutado durante días seguidos.

Intenté configurar la propiedad max connections en App.config, pero eso no pareció ayudar en absoluto. Luego entré y todas y cada una de las referencias a HttpWebRequest, HttpWebResponse y los objetos de flujo utilizados para leer / escribir datos en estos objetos usando bloques.

Eso parece haber hecho el truco. Llevo casi 24 horas funcionando sin tiempo de espera y sin Fiddler ejecutándose.

La forma en que realiza la consulta hace que se cree una nueva sesión para cada llamada, que es una sobrecarga, podría ser que el violinista agregue sesión a sus consultas ...

prueba

CookieContainer estático privado _cookieContainer = new CookieContainer ();

_httpWebRequest.CookieContainer = _cookieContainer; // con el reciclaje del contenedor de cookies

Tuvimos el mismo problema, establezca su httpWebRequest.PreAuthenticate en verdadero.

ya no deberías tener una respuesta 401, así que abrirás menos conexiones ...

Tuve el mismo problema. Descargué esto: http://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html Fue la razón de rendimiento de la HttpWebRequest. Modifica TCPAckFrequency y arruina totalmente todo. Lo eliminé y ahora FUNCIONA.

Para mí, estaba configurando request.ProtocolVersion = HttpVersion.Version10;

La configuración predeterminada para esto es HttpVersion.Version11. Cuando configuré esto por defecto, mis solicitudes fueron mucho más rápidas sin el violinista.

¡Espero que esto ayude a alguien más, me ha tomado toda la mañana resolver esto!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top