[C#] HttpWebResponse

Ronox

Mitglied
Hallo,

ich will auf eine Homepage zugreifen die Leider immer ein
"Internal Server Error - 500" per Response Header zurück liefert in Firefox.

Natürlich kommt der Fehler auch bei meinem Programm bei der Code Zeile:

Code:
 response = (HttpWebResponse)request1.GetResponse();

"Der Remoteserver hat einen Fehler zurückgegeben: (500) Interner Serverfehler."

Wenn ich das ganze per try & catch abfange, kann der StreamReader natürlich keinen passenden Stream auffinden.
Hat Irgendjemand eine Idee? Wie ich das jetzt wie in Firefox Ignorieren kann und trotzdem an den Inhalt komme?

MFG Ronox
 

Turri

Erfahrenes Mitglied
Hallo,

bist du sicher, dass der Firefox fehlerfafte Antworten ignoriert?
Ich vermute eher, der Firefox macht was richtig, was du aber im Code falsch machst.

Wie stellst du denn deine Anfrage, um an deine Seite zu kommen?
 

Ronox

Mitglied
Ok hier mal der komplette Code:

Code:
        private CookieContainer cookieContainer = new CookieContainer();

        CookieCollection cookiecoll = new CookieCollection();
        
        HttpWebRequest request;
        HttpWebResponse response;
        StreamReader sr;

[...]

       public string plogin(string user, string pw, string server, string url)
        {
            HttpWebRequest request0 = (HttpWebRequest)HttpWebRequest.Create(server);
            request0.Method = "GET";
            request0.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
            request0.CookieContainer = new CookieContainer();
            response = (HttpWebResponse)request0.GetResponse();
            cookiecoll = response.Cookies;
            response.Close();

            HttpWebRequest request1 = (HttpWebRequest)HttpWebRequest.Create(server + url);
            request1.Method = "POST";
            request1.Host = server.Replace("http://","").Replace("/","");
            request1.ContentType = "application/x-www-form-urlencoded";
            request1.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
            request1.Referer = server;
            request1.CookieContainer = new CookieContainer();
            request1.CookieContainer.Add(cookiecoll);
            request1.ServicePoint.Expect100Continue = false;
            request1.Timeout = 30000;
            
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] loginDataBytes = encoding.GetBytes("server="+ server + url +"&user="+user+"&password="+pw+"&x=0&y=0");
            
            request1.ContentLength = loginDataBytes.Length;

            Stream stream = request1.GetRequestStream();
            stream.Write(loginDataBytes, 0, loginDataBytes.Length);
            stream.Close();

            // Hier tritt der Fehler auf
            response = (HttpWebResponse)request1.GetResponse();

            sr = new StreamReader(response.GetResponseStream());
            string html = sr.ReadToEnd();
            sr.Close();

            response.Close();

            string tmp = "";
            foreach (Cookie cook in cookiecoll)
            {
                tmp = cook.ToString();
                MessageBox.Show("1. Step: " + cook.ToString());
            }

return "\"Cookie:\" "+tmp;
}

Das ist der Response Header von Firefox:
Status=Internal Server Error - 500
Transfer-Encoding=chunked
Expires=Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control=no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma=no-cache
Content-Type=text/html
Date=Tue, 01 Mar 2011 17:20:14 GMT
Server=RMSWebServer/1.0

Und er zeigt mir trotzdem den Content an in Firefox.
 

Turri

Erfahrenes Mitglied
Hallo,

ich sehe einen Unterschied (wie ich sonst HttpRequests verschicke) bei der Cookiebehandlung.
Ich arbeite ohne CookieCollection.
C#:
...
cookies = new CookieContainer();

public string sendGetRequest(string url, string referer)
        {
            HttpWebRequest HttpReq = (HttpWebRequest)WebRequest.Create(url);
            HttpReq.Referer = referer;
            HttpReq.CookieContainer = cookies;

            HttpWebResponse response;
            try
            {
                response = (HttpWebResponse)HttpReq.GetResponse();                
            }
            catch (WebException ex)
            {
                ....              
            }
            StreamReader reader = new StreamReader(response.GetResponseStream());

            return reader.ReadToEnd();
        }

Die "cookies" sind dann gefüllt, nach der GetResponse() von GET Request.
Die cookies werden nur in der Instanz der klasse gepseichert und beim nächsten Request einfach wieder mit angegeben. Responsecookies werden nicht berücksichtigt. Die waren bei mir immer leer... komischerweise...

und hier dann ein Post Request:
C#:
public string sendPostRequest(string url, string postData, string referer)
        {
            HttpWebRequest HttpReq = (HttpWebRequest)WebRequest.Create(url);

            byte[] data = Encoding.UTF8.GetBytes(postData);

            HttpReq.Method = "POST";
            HttpReq.Referer = referer;
            HttpReq.CookieContainer = cookies;
            HttpReq.ContentType = "application/x-www-form-urlencoded";
            HttpReq.ContentLength = data.Length;
            HttpReq.ServicePoint.Expect100Continue = false;

            HttpWebResponse response;

            try
            {
                Stream newStream = HttpReq.GetRequestStream();
                newStream.Write(data, 0, data.Length);
                newStream.Close();
                response = (HttpWebResponse)HttpReq.GetResponse();
            }
            catch (WebException ex)
            {
                ...
            }
            StreamReader reader = new StreamReader(response.GetResponseStream());

            return reader.ReadToEnd();
        }

Funktioniert bei mir sehr gut.

Du kannst notfalls ja mit dem Firefox Plugin "Live Http Headers" schauen, was der Firefox über die Leitung schickt. Vielleicht gibts doch einen Unterschied zu deiner Anfrage.
 
Zuletzt bearbeitet:

Ronox

Mitglied
Hi,

also ich habs natürlich mit deiner Variante probiert und mir die WebException ausgeben lassen:

Code:
System.Net.WebException: Der Remoteserver hat einen Fehler zurückgegeben: (500) Interner Serverfehler.
   bei System.Net.HttpWebRequest.GetResponse()
   bei Monstergame_Bot.http.sendGetRequest(String url, String referer) in C:\Users\ronox\AppData\Local\Temporary Projects\Monstergame Bot\http.cs:Zeile 23.

System.Net.WebException: Der Remoteserver hat einen Fehler zurückgegeben: (500) Interner Serverfehler.
   bei System.Net.HttpWebRequest.GetResponse()
   bei Monstergame_Bot.http.sendPostRequest(String url, String postData, String referer) in C:\Users\ronox\AppData\Local\Temporary Projects\Monstergame Bot\http.cs:Zeile 53.

Den Response Header habe Ich von einem anderen Addon, aber habe das ganze nochmal durch Http Live Headers gejagt und es kommt folgendes raus:

Code:
POST /index.php?ac=login HTTP/1.1
Host: <host>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: <referer>
Cookie: SSID=02f5605e94d19e9d4d85cef8b0f37e89f642d9d1
Content-Type: application/x-www-form-urlencoded
Content-Length: 112
server=<post>
HTTP/1.1 500 Internal Server Error
Transfer-Encoding: chunked
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Date: Wed, 02 Mar 2011 14:07:02 GMT
Server: RMSWebServer/1.0
 

Turri

Erfahrenes Mitglied
Hallo,

das find ich ja echt interessant.

Ich hab gerade keine Seite da, wo ich einen Fehler 500 bekomme.
Aber du kannst ja mal versuchen, die Response in der Exception ausgeben zu lassen.
Vielleicht steht ja der SeitenCode drin.

C#:
HttpWebResponse response;
            try
            {
                 // hier krachts ja...
                response = (HttpWebResponse)HttpReq.GetResponse();

            }
           catch (WebException ex)
            {
                // und hier gehts weiter
                response = (HttpWebResponse)ex.Response;
                // Console.WriteLine(response.StatusCode);
                // Console.WriteLine(response.StatusDescription);
                if (response.StatusCode == HttpStatusCode.InternalServerError)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());
                    Console.Write(reader.ReadToEnd());
                }
            }

Ob das funktioniert, weiß ich aber nicht.
 

Ronox

Mitglied
Hey du bist gut ;)

Ich danke dir für deine Hilfe :) es hat Funktioniert, etwas eigenartig, find ich.
Aber es klappt :)
 

Neue Beiträge