HttpWebRequest, KeepAlive und Mehrfachanfrage (tut nicht)
-
Hallo,
ich würde gerne mehrfach hintereinander "GET" Requests über eine bereits
bestehende Verbindung senden, das würde dementsprechend so aussehen:GET /.... HTTP/1.1 Host: ... usw
Dann kommt als Antwort vom Server zurück
HTTP/1.1 200 OK ... {Daten}
Nachdem die Daten vom Server gesendet wurden, möchte ich einen weiteren GET
Request senden (sieht genauso aus wie der erste, allerdings kommen dann vom
Server aktualisierte Daten zurück)Soweit die Theorie, aber wie setzt man das um?
Mein Code sieht so aus:private HttpWebResponse m_getDataSync() { string address = "http://www.example.com/foo.php"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address); request.CookieContainer = m_cookies; request.Credentials = CredentialCache.DefaultCredentials; request.KeepAlive = true; request.Method = "GET"; HttpWebResponse result = (HttpWebResponse)request.GetResponse(); return result; }
Laut http://msdn.microsoft.com/de-de/library/system.net.httpwebrequest.getresponse(VS.80).aspx
hilft es nichts, "GetResponse()" mehrfach aufzurufen:Mehrere Aufrufe von GetResponse geben das gleiche Antwortobjekt zurück. Die Anforderung wird nicht erneut gesendet.
Google hilft mir auch nicht so recht weiter. Wenn man hiernach geht
http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/930c06f1-8ba2-4aff-81fa-93dd2840f3ce/
soll man einfach einen neuen Request erzeugen, der dann automatisch über die gleiche Verbindung
gesendet wird, hier wird beschrieben, dass sich der ServicePointManager drum kümmert:
http://www.eggheadcafe.com/forumarchives/NETFramework/Oct2005/post24397848.aspAn anderer (mir gerade nicht mehr bekannter Stelle soll man das DefaultConnectionLimit vom ServicePointManager auf 1 setzen).
Nur irgendwas hab ich wohl trotzdem falsch gemacht.
Wenn ich obige Funktion m_getDataSync() das erste mal aufrufe, wird eine Verbindung hergestellt und
ein GET Request gesendet. Danach ist die Verbindung immer noch offen.
Rufe ich die Funktion ein zweites Mal auf, wird aber kein Reqeuest mehr gesendet, weder über die
bestehende noch über eine neue Verbindung.Bin um Tips dankbar.
Gruss,
Martin
-
Hast Du dich schon einmal gefragt ob der Server das möchte.
Der Server kann entscheiden ob Keepalive sein soll oder nicht. Stellt dir mal vor er würde es erlauben. Da könnte man so einen Server total blockieren.
Ich baue einfach mal 65000 Verbindungen auf und warte.
Also nicht jeder Server erlaubt Keepalive.
Ist aber nur ein Ansatz für Dich weiter zu suchen.
-
Hallo,
danke für die Antwort,
ja, das hab ich mich gefragt und der Server macht das auch mit:
Wenn ich mich mit telnet verbinde, dann kann ich mehrmals ein "GET" senden und erhalte
jedesmal entsprechend andere Daten.Ich bekomm's nur einfach nicht hin, weitere GET Requests mittels HttpWebRequest
zu senden und ich verspüre etwas wenig Lust, das HTT Protokoll neu zu implementieren,
wenn's schon was fertiges gibt.
-
grmlhmpf **zensiert**
ich glaub ich weiß woran es liegt.
Man muss die Daten erst auslesen, bevor eine weitere Anfrage gesendet werden kann:Also am Beispiel oben:
HttpWebResponse response = m_getDataSync(); Stream responseStream = response.GetResponseStream(); StreamReader sr = new StreamReader(responseStream); sr.ReadToEn();
Ausserdem ist nicht System.Net.ServicePointManager.ConnectionLimit gemeint, sondern
HttpWebReqeust.ServicePoint.ConnectionLimit.