Warum verbessert sich die Leistung des HTTPWebRequest -Objekts bei der Verwendung von Fiddler?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich bekomme ein sehr seltsames Verhalten mit httpwebRequest Ich hoffe, jemand kann mir helfen. Ich habe eine Konsolen -App, die eine Aggregationsarbeit durch Verwendung des HTTPWebRequest -Objekts erledigt, um den Inhalt einer Zielwebsite abzurufen. Aufgrund der Art der Anforderung ist die App mit Multithread und versucht, zwischen 10 und 30 gleichzeitige Verbindungen herzustellen (ich habe mit einem Wertebereich experimentiert). Die tatsächliche Webanforderung ist wie folgt strukturiert:

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;

Das seltsame Verhalten ist trotzdem, dass die App unter normalen Umständen rund 120 Anfragen pro Minute erreicht. Wenn ich jedoch Geiger öffne, springt sie auf etwa 600. Mit Windows 7 Resource Monitor kann ich die Netzwerkaktivität entsprechend erhöhen. In den TCP -Verbindungen für den Konsolenprozess werden nun die Remote -Adresse als "IPv4 -Loopback" statt der IP -Adresse der Zielserver (erwartet) aufgeführt. Ich habe mich über die maximale Anzahl von gleichzeitigen HTTP -Anfragen gewundert, die von der Maschine zulässig sind, aber das Ändern dieser in der Registrierung scheint keinen Unterschied zu machen.

Die Frage ist also; Was ist mit Fiddler, das plötzlich den Durchsatz mit dem Fünffachen erhöht, und wie kann ich dies nativ auf der Maschine erreichen, ohne ein anderes Tool zu starten?

Vielen Dank!

War es hilfreich?

Lösung

Sieht so aus, als hätte ich jetzt den Durchsatz in der Lage gewesen, den Durchsatz zu erreichen (bis ich es verdoppelt habe, was ich mit Fiddler Open tatsächlich bekam), indem ich die maximalen Verbindungen in der App.Config einstellte:

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

Sehr zufrieden mit dem Ergebnis, bin aber immer noch ein wenig mystifiziert darüber, warum das Öffnen von Fiddler die Ergebnisse so dramatisch verändert hat.

Andere Tipps

Eine Sache, die mir sofort aufgefallen ist, ist, dass Sie nicht mit Blöcken implementieren. Dies fügt einen Zufälligkeitsfaktor hinzu, der möglicherweise mit der Anzahl der Anfragen multipliziert werden könnte. Ich schlage daher vor, dass Sie dies beheben:

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();
        }
    }
}

Als nächstes fungiert Fyi, Fiddler als Stellvertreter. Wenn Ihr Standard -Proxy für die Einrichtung eines Skripts zur Einrichtung der Proxy -Konfiguration eingerichtet wurde, frage ich mich, ob das Ausführen von Geiger die für das Skript -Setup erforderliche Zeit möglicherweise nicht beseitigt. Das kann nur einmal passieren und nicht auf jeder Anfrage.

Ich hatte ein ähnliches Problem wie deins und wollte meine Lösung teilen.

Kurz gesagt, ich hatte ein Konsolenprogramm, das HTTP -Anfragen stellte und nach ungefähr 15 Minuten Zeitüberschreitungen. Wenn ich jedoch Geiger benutzte, habe ich noch nie Zeitüberschreitungen erlebt, auch nachdem es tagelang gerade laufen ließ.

Ich habe versucht, die MaxConnections -Eigenschaft in app.config festzulegen, aber das schien überhaupt nicht zu helfen. Ich ging dann ein und jeder Verweis auf HTTPWebRequest, HTTPWebresponse und die Stream -Objekte, mit denen Daten in diesen Objekten in Blöcken gelesen/geschrieben werden.

Dass scheint den Trick gemacht haben. Ich bin jetzt seit fast 24 Stunden ohne Auszeit und ohne Geiger ausgeführt.

Die Art und Weise, wie Sie abfragen, führt dazu, dass eine neue Sitzung für jeden Anruf erstellt wird. Dies könnte sein.

Versuchen

private statische CookieContainer _cookiecontainer = new CookieContainer ();

_httpWebRequest.cookieContainer = _cookieContainer; // mit dem Recycling des CookieContainers

Wir hatten das gleiche Problem, legten Ihre httpwebrequest.preautauthenticate auf true.

Sie sollten keine 401 -Antwort mehr haben, also werden Sie weniger Verbindungen öffnen ...

Ich hatte das gleiche Problem. Ich habe das heruntergeladen:http://www.wowinterface.com/downloads/info13581-leatrixLatencyfix.htmlEs war der Grund für die Leistung des httpwebRequest. Es modifiziert TCPackFrequency und macht alles völlig durcheinander. Ich habe es entfernt und jetzt funktioniert es.

Für mich setzte ich mich ein request.ProtocolVersion = HttpVersion.Version10;

Die Standardeinstellung dafür ist httpversion.version11. Als ich dies auf die Standardeinstellung einstellte, wurden meine Anfragen ohne Geiger viel schneller.

Ich hoffe, das hilft jemand anderem, es hat den ganzen Morgen gebraucht, um das herauszufinden!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top