HttpWebRequest - beim 1. mal gehts, danach timeout
-
Ich rufe mittels HttpWebRequest einige Daten von einem Server.
Dazu rufe ich die Loginseite auf, mit parametern in der url, die mich einloggen, nach login rufe ich die gewünschte seite auf, und nehme die cookies mit einem cookie container mit.
Den inhalt der seite rufe ich mit GetResponse() ab.
Danach rufe ich die Logut seite auf, und bin wieder draußen.
dann werden die abgerufenen daten ausgewertet
Soweit die theorie, hier die ralität:
Das ganze ist in einer methode implementiert, diese methode wird mehrmals nacheinander mit verschiedenen zugangsdaten aufgerufen.Beim 1. Mal funktioniert es reibungslos.
Ab dem 2. Mal bekomme ich nurnoch Timeouts, obwohl der server erreichbar ist.
Ich versteh nicht wieso, es ist ein und derselbe code der fürs abrufen zuständig ist.
Hier mal mein codeauschnitt:string seiteninhalt = ""; Random zz = new Random(); try { request = (HttpWebRequest)WebRequest.Create("http://xxx.yyy.de/zzz.php?nick=" + user + "&password=" + pw + "&x=" + zz.Next(20, 35) + "&y=" + zz.Next(20, 35)); request.CookieContainer = new CookieContainer(); response = (HttpWebResponse)request.GetResponse(); request2 = (HttpWebRequest)WebRequest.Create("http://xxx.yyy.de/tttt.php"); request2.CookieContainer = request.CookieContainer; request2.Timeout = 120000; response2 = (HttpWebResponse)request2.GetResponse(); stream1 = response2.GetResponseStream(); sr = new StreamReader(stream1); seiteninhalt = sr.ReadToEnd(); request3 = (HttpWebRequest)WebRequest.Create("http://xxx.yyy.de/pppp.php"); request3.CookieContainer = request2.CookieContainer; sr.Close(); stream1.Close(); } catch (WebException e) { if (e.Status == WebExceptionStatus.Timeout) { MessageBox.Show("Fehler beim Abrufen der Daten von " + user + "\nBitte Zugangsdaten per Einzelabruf überprüfen.\nFehlermeldung: " + e.Message, "Fehler beim Datenabruf"); abruffehler = 1; } }
Er hängt ab dem 2. Mal immer bei der abfrage
response2 = (HttpWebResponse)request2.GetResponse();
Kann mir jemand sagen woran das liegt?
Das sind alles lokale variablen der methode, also wieder geleert beim neuen aufruf.
Danke.
-
Das hättest du in C aber eleganter lösen können.
-
du schrieb:
Das hättest du in C aber eleganter lösen können.
Das interessiert hier wohl weniger.
Das Problem ist, dass Dein Rechner \ Programm nur eine bestimmte Anzahl von gleichzeitigen Verbindungen zulässt. Und der GC löscht die Objekte leider nicht immer so wie man das gerne hätte. Also probiere es mit:
ServicePointManager.DefaultConnectionLimit = 100;
Hau das z.B. in Deinen Constructor und die Sache sollte laufen.