Laden...

HTTP-Requests nicht in Wireshark

Erstellt von jov97 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.466 Views
J
jov97 Themenstarter:in
13 Beiträge seit 2011
vor 10 Jahren
HTTP-Requests nicht in Wireshark

Moin,

Folgendes Problem: ich sende eine GET-Request an den Server, bekomme auch eine Antwort. Jedoch loggt Wireshark ab dem 2. oder 3. Mal diese Request garnicht mehr mit, nur die Antwort dazu, und der Server meldet mir, dass ich x mal verbunden bin. Ich nehme daher an, dass die Verbindung nicht geschlossen wird (?!) und Wireshark erst dann loggen würde (kenne mich mit WS nicht so gut aus, gibt es da eine Möglichkeit, auch noch offene Verbindungen anzusehen?)

Quelltext meiner Request-Funktion:

public string SendGetRequest(string uri)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
            req.Method = "GET";
            req.UserAgent = "Mozilla/10.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36";
            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/asterisk;q=0.8";
            req.CookieContainer = cookies; //vordefinierter Container
            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
            cookies.Add(response.Cookies);
            Stream st = response.GetResponseStream();
            StreamReader sr = new StreamReader(st);
            string buffer = sr.ReadToEnd(); //alles wird gelesen
            st.Close(); //stream wird geschlossen
            response.Close(); //antwort auch
            pagelist.Items.Add(uri); //unwichtig
            return buffer;
        }

Hab ich irgendwas vergessen? Eigentlich habe ich doch alles an der Verbindung geschlossen.

Besten Dank im Voraus!

Lieber eine Glatze als gar keine Haare.

16.834 Beiträge seit 2008
vor 10 Jahren
  1. Schon mal das Protokoll HTTP näher begutachtet und gesehen, wie die Kommunikation funktioniert?
  2. Es macht immer sinn, den Code auch zu verstehen, den man irgendwo kopiert. Grund: so entdeckt man Fehler oder Tücken besser.
    Stichworte: CachePolicy und using()-Anweisung.
J
jov97 Themenstarter:in
13 Beiträge seit 2011
vor 10 Jahren

Ähm - ich weiß nicht, woher du wissen willst, dass der Code - wenn auch recht simpel - kopiert ist. Da muss deine Glaskugel wohl einen Sprung haben.
Mit HTTP und TCP kenne ich mich aus, genau deshalb kann ich mir dieses Verhalten auch überhaupt nicht erklären. Die Anfrage wird anscheinend nicht vollständig abgeschickt o.ä. Deshalb wird sie auch nicht von Wireshark mitgeschnitten. Das ergäbe aber keinen Sinn, denn die Antwort kommt an.

Eine using-Anweisung macht doch hier in meinen Augen gar keinen Sinn, HttpWebRequest ist nicht IDisposable. Oder was meinst du damit genau? Außerdem verstehe ich auch nicht, was die CachePolicy mit meinem Problem zu tun haben soll.

Entschuldige bitte meinen Ton, ich weiß, du bist hier Moderator. Aber versuche es doch bitte nicht gleich mit Noob-Bashing. Dieses Von-oben-herab-Tipps-geben bringt mich auf die Palme, es hilft einfach nicht weiter.

Lieber eine Glatze als gar keine Haare.

I
36 Beiträge seit 2013
vor 10 Jahren

Mal was ganz anderes:
Warum überhaupt HttpWebRequest und Response?
Wird aus einem bestimmten Grund die System.Net.WebClient.Class nicht verwendet?

++++ Tag ein, Tag aus: HTML-Programmierer beklagt monotone Arbeit ++++
++++ Ein Witz auf seine Kosten: Masochist kann nur gequält lächeln ++++
++++ Nichts dran: Model leugnet Magersucht ++++

16.834 Beiträge seit 2008
vor 10 Jahren

Das ist nicht von oben herab und hat mit Mod nichts zutun.

Der Code entspricht im Format, das heißt Reihenfolge vom Code, Benamsung der Variablen zu 99% den ersten Treffern bei Google.
Dazu kommt, dass Du Klassen verwendest, die IDisposable implementieren, Du aber kein using-Block verwendest; ebenfalls ein Indiz fürs stupide Kopieren.
Dieser bezieht sich vor allem auf Stream; und den StreamReader schließt Du übrigens nirgends, das wiederum ein Problem sein könnte.

Dann noch mein Hinweis mit dem Cache: Du setzt nirgens die CachePolicy und damit ist die Wahrscheinlichkeit relavit hoch, dass Deine Antwort nich vom Server sondern vom Cache geladen wird. Damit taucht auch keine Anfrage in WireShark auf, da der Server gar nicht angesprochen wird.

Nächster Makel, der aber nicht Lösungsrelevant ist: Dein Useragent gibt es so meines Wissens nicht.
IIRC heißt es immer Mozilla/5.0 und nicht 10.0 - egal welche Version oder Browser.

I
36 Beiträge seit 2013
vor 10 Jahren

Tatsache - also das mit dem StreamReader - aber ich hatte den Code auch nur überflogen.

Wirft der Streamreader eigentlich keine Exception wenn man dem den Stream unterm Hintern kappt? Oder ist hier C# "intelligent" und hält den Stream noch trotz close? (Ich habe keine Lust das jetzt auszuprobieren und vllt. weiß das ja jemand.)

++++ Tag ein, Tag aus: HTML-Programmierer beklagt monotone Arbeit ++++
++++ Ein Witz auf seine Kosten: Masochist kann nur gequält lächeln ++++
++++ Nichts dran: Model leugnet Magersucht ++++

16.834 Beiträge seit 2008
vor 10 Jahren

Die Ressourcen bleiben in der Verwaltung wenn ein Stream nicht geschlossen wird bzw. im dispose landet (was ein close durchführt).
Daher auch mein Hinweis immer, sofern die Logik es ermöglicht, ein using() verwenden, da ein using so zuverlässig ist, dass die Ressourcen freigegeben werden, auch wenn eine Exception im Block ausgeführt wird.

Würde hier im Code sr.ReadToEnd(); ein Fehler werfen,, was jetzt nicht soooo unwahrscheinlich ist, dann würden alle Streams offen bleiben.
Daher macht hier ein using ohne Wenn und Aber auch sinn, wenn man das Prinzip einfach nur verständen hätte.
Und da kann der Threadopener sich nun so sehr auf den Schlips getreten fühlen wie er will: ich hab recht. 😜