Der Grund ist das Limit für die Anzahl der HTTP-Verbindungen, die bei der Verwendung von Fiddler ignoriert werden.
Ich habe das gleiche Verhalten bei der Verwendung von System.Net.Http.HttpClient
zu mehreren (~ 80) gleichzeitige Anfragen aufgetreten. Während Fiddler lief, wurden alle Anfragen viel schneller abgeschlossen. Keep-Alive war sicherlich aktiviert.
Ich benutzte Wireshark, um zu sehen, was passiert ist und das erste, was ich bemerkte, dass die Art des http-Verkehrs war anders. Mit Fiddler wurden alle Anfragen gleichzeitig beantwortet und danach folgten die Antworten auch gut gruppiert. Ohne Fiddler verschachtelten sich die Anfragen mit Antworten.
Zweitens zeigte tcpview, dass mein Code ohne Fiddler nur 2 TCP-Verbindungen zum Server erstellt. Mit dem Start von Fiddler hat sich die Anzahl der Verbindungen drastisch erhöht. Es gab Dutzende davon von meiner App zu Fiddler und dann von Fiddler zum Server.
Es ist allgemein bekannt, dass der http-Standard empfiehlt die Anzahl der http-Verbindungen sollte nicht mehr als 2 sein und es scheint, dass das Limit als Standardeinstellung in http-Clients implementiert ist.
In .NET-Anwendungen können wir das Limit mit ServicePointManager.DefaultConnectionLimit
statische Eigenschaft steuern. Als ein Experiment, nachdem es auf 100 gesetzt wurde, machten die Anfragen die gleiche Geschwindigkeit mit oder ohne Fiddler.
kann die Einstellung auch durch app.config gesteuert werden:
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
Nun, warum wird das Standard-Verbindungslimit bei der Verwendung von Fiddler nicht respektiert? Es stellt sich heraus, dass das Limit unterschiedlich ist, wenn ein HTTP-Client einen Proxy verwendet und Fiddler als Proxy fungiert. Ich habe außer this old article nicht viele Informationen über das Proxy-Verbindungslimit gefunden.
In meinem Programm, wenn ich eine Verbindung erstellen und den Inhalt herunterladen, dann werde ich die Antwort schließen und die Anfrage im Finale abbrechen, aber ich frage mich, dass dies der gleiche Code ist, der mit fiddler im Hintergrund und seine läuft schnell. ändert der Fiddler meine Anfrage und benutzt für jede Anfrage die gleiche Verbindung? – Ehsan
@Eshan _ "Ändert Fiddler meine Anfrage und verwendet für jede Anfrage dieselbe Verbindung?" _ Ja. – CodeCaster
Wie kann ich diese Funktion in meinem Programm mit HttpWebRequest verwenden? – Ehsan