Entwickler-Ecke

ASP.NET und Web - HTML GET funktioniert dann nicht mehr?


BlackMatrix - Mo 14.12.09 19:56
Titel: HTML GET funktioniert dann nicht mehr?
Hey, ich habe bereits in einem anderen Forum geschrieben, jedoch keine Antwort bekommen :(

Ich rufe in meinem Hauptprogramm:

1. die Loginfunktion auf "LogIn"
2. hole ich mir den Quelltext einer URL, wofür man Cookies benötigt mit "GetHtml"
3. mache eine Postanfrage mit "GetHtmlPost"
------
4. jetzt will ich mir eine neue URL mit GetHtml holen, jedoch bekomme ich nun bei


C#-Quelltext
1:
response = (HttpWebResponse)request.GetResponse();                    


in "GetHtml" einen Timeout.

Ich hatte jetzt vor den ersten GetHtml Aufruf (der ja funktioniert, solange noch nicht GetHtmlPost aufgerufen wurde), mit dem GetHtml Aufruf nach GetHtmlPost zu vergleichen. Gibt es im Visual Studio 2008 irgendwie die Funktion, 2 Klassen miteinander zu vergleichen oder hat sonst irgendjemand die Lösung des Problems?

Würde mich sehr freuen, vielen Dank.

Mein Code:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
 class HttpHelper
        {
            private CookieContainer cookieContainer = new CookieContainer();
            HttpWebRequest request;
            HttpWebResponse response;
            StreamReader sr;

public string GetHtml(string url, string useragent, string referer)
            {
                request = (HttpWebRequest)HttpWebRequest.Create(klickurl);
                request.CookieContainer = cookieContainer;
                request.Method = "GET";
                request.Referer = referer;
                request.UserAgent = useragent;
                response = (HttpWebResponse)request.GetResponse();
                sr = new StreamReader(response.GetResponseStream());
                string html = sr.ReadToEnd();
                sr.Close();
                response.Close();
                return html;
            }

            public void GetHtmlPost(string sendestring, string useragent, string sendeurl, string referer)
            {
                request = (HttpWebRequest)HttpWebRequest.Create(sendeurl);
                request.Method = "POST";
                request.Referer = referer;
                request.UserAgent = useragent;
                request.ContentType = "application/x-www-form-urlencoded";
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] loginDataBytes = encoding.GetBytes(sendestring);
                request.ContentLength = loginDataBytes.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(loginDataBytes, 0, loginDataBytes.Length);
                stream.Close();
                response = (HttpWebResponse)request.GetResponse();
            }

            public void LogIn(string loginstring, string useragent, string loginurl, string referer)
            {
                request = (HttpWebRequest)HttpWebRequest.Create(loginurl);
                request.CookieContainer = cookieContainer;
                request.Method = "POST";
                request.Referer = referer;
                request.UserAgent = useragent;
                request.ContentType = "application/x-www-form-urlencoded";
                ASCIIEncoding encoding = new ASCIIEncoding();
                byte[] loginDataBytes = encoding.GetBytes(loginstring);
                request.ContentLength = loginDataBytes.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(loginDataBytes, 0, loginDataBytes.Length);
                stream.Close();
                response = (HttpWebResponse)request.GetResponse();
            }


Christian S. - Mo 14.12.09 21:00

Ich glaube, es wäre schonmal viel geholfen, wenn Du Felder Deine Klasse nicht als globale Variablen missbrauchst, sondern Deine Variablen sauber in den Methoden deklarierst, in denen Du sie auch benutzen willst. Dann kannst Du eine Menge Seiteneffekte vermeiden und die Fehlersuche wird viel einfacher.


BlackMatrix - Mo 14.12.09 21:19

Was meinst du mit:
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
[...]Felder Deine Klasse [...]


Globale Variablen habe ich doch nur den Useragent, den möchte ich auch ändern können, ohne jede Methode durchzugehen. Der Rest bleibt doch lokal. Ich bemerke gerade, dass ich ein Stück Quellcode vergessen habe


C#-Quelltext
1:
2:
3:
4:
5:
6:
 class HttpHelper
        {
            private CookieContainer cookieContainer = new CookieContainer();
            HttpWebRequest request;
            HttpWebResponse response;
            StreamReader sr;


Ich habe es oben abgeändert.


Christian S. - Mo 14.12.09 21:24

Genau das, was Du gerade gepostet hast, sind Felder Deiner Klasse, die Du als globale Variablen "missbrauchst".

Wozu müssen request, response, sr denn als Felder deklariert sein? Die kannst Du auch in jeder Methode neu deklarieren!


BlackMatrix - Mo 14.12.09 22:36

Naja, das hat nichts gebracht, aber wenn ich das Programm neustarte, dann funktioniert meine GetHtml Methode wieder.

Nur was für ein Problem, könnte denn so einen Timeout verursachen? Die Cookies können es nicht sein, dann bekäme ich doch die Seite ohne das ich eingeloggt bin. Der Webrequest und Webresponses werden ja immer nur lokal in meinen Methoden ausgeführt, sodass meine GetHtmlPost Methode ja eigentlich keine Werte veränderen dürfte, weswegen HtmlGet dann danach den Timeout verursacht :-/


BlackMatrix - Mi 16.12.09 21:19

OMG. Ich sitze hier 1,5 Tage nur an der HTMLPost sache und dann liegt es nur an

C#-Quelltext
1:
response.Close();                    


Schade, dass mir das keiner sagen konnte :(


danielf - Do 17.12.09 09:03

Hättest du den Vorschlag von Christian angenommen, wäre es auch eine Lösung gewesen.


BlackMatrix - Di 19.01.10 20:31

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Hättest du den Vorschlag von Christian angenommen, wäre es auch eine Lösung gewesen.


Da muss ich dich enttäuschen. Der response muss scheinbar immer geschlossen werden, auch wenn er sich nur innerhalb einer Methode befindet, ansonsten bekommt man den besagten Timeout.


danielf - Di 19.01.10 20:46

Wenn du es nicht als Feld sondern in einem using block gemacht hättest, würde er ein Close automatisch machen ! Und dementsprechen wohl gehen...aber wahrscheinlich hast es nicht verstanden....