HTTP Webrequest funktioniert nicht

Maatze123

Grünschnabel
Hallo Leute,

wir haben zur Zeit ein ziemlich großes Problem. Zuerst muss ich anmerken das wir noch ziemliche Anfänger auf dem
C#-Gebiet sind. Wir versuchen in unserem Projekt auf den Inhalt einer WebSeite zuzugreifen. Dazu müssen wir uns zuerst
automatisch bei der Website einloggen, um dann auf die entsprechende Seite zu gelangen.

Als Beispiel dafür könnte man den Zugriff auf einen speziellen Thread in einem Forum nehmen, der nur für eingeloggte User
sichtbar ist. Man muss sich zuerst einloggen um die Seite überhaupt eingezeigt zu bekommen. Das wollen wir nun in unserem
Programm machen.

Unsere erste Idee war es den Zugriff über ein Cookie zu machen, allerdings verliefen unsere Bemühungen in diesem
Bereich im Sande. Nun haben wir ein Programm erstellt das per WebRequest auf die Website zugreift und lesen damit den
Quellcode der Seite aus. Über PreAuthenticate + NetworkCredentials sollten dem Server Username und Password übergeben
werden.

Das Programm lässt sich nun ohne Fehler ausführen, jedoch gelingt uns das einloggen nicht und wir
bekommen nur den Quellcode der Seite auf die wir weitergeleitet werden (als ob wir nicht eingeloggt wären -->Logout Seite).
Der Server reagiert also praktisch überhaupt nicht auf unseren Login-Versuch.

Hier unser bisheriger Code:

Code:
        public static void Main()
        {
            //Webrequest wird gestartet
            WebRequest request = WebRequest.Create("http://www.zmp.de/login/default.asp"); //Default-Loginseite
	    //"http://www.zmp.de/milchvbereich/wk.asp" = die Unterseite auf die wir eigentlich zugreifen wollen

            //Sendet die Credentials ohne Aufforderung des Servers
            request.PreAuthenticate = true; 

            //Username und Passwort werden definiert
            string strUserName = "****"; 
            string strPassword = "****";

            //Network.Credentials werden übergeben
            NetworkCredential networkCredential = new NetworkCredential(strUserName, strPassword);
            request.Credentials = networkCredential;
            WebResponse response = request.GetResponse();
            
            //DataStream wird geöffnet
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.WriteLine(responseFromServer);

            //Schreibt Antwort in TXT-Datei
            StreamWriter WStream = new StreamWriter("test.txt");
            WStream.Write(responseFromServer);

            WStream.Close();
            reader.Close();
            dataStream.Close();
            response.Close();
            Console.ReadLine();
        }

Mittlerweile haben wir auch noch eine zweite Methode gefunden, die allerdings genau das selbe Ergebnis liefert wie die Vorherige. Hier der Neue:

Code:
class Programm
    {
        private static HttpWebRequest request;
        private static HttpWebResponse response;
        public static void Main()
        {

            string requestUrl = "http://www.zmp.de/login/default.asp";
            //Diese Parameter werden per Post Methode übergeben
            string requestParameter = "UserID=****&Password=****&Ziel=&Url=&Lizenz=&Titel=&Login=Login&Anmelden=Hier einloggen";

            request = (HttpWebRequest)WebRequest.Create(requestUrl);

            #region Schreib Werte in den RequestStream der an die URL geschickt wird
            byte[] parameter = Encoding.UTF8.GetBytes(requestParameter);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = parameter.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(parameter, 0, parameter.Length);
            requestStream.Close();

            #endregion

            //Holt sich die Antwort
            response = (HttpWebResponse)request.GetResponse();

            #region Liest die Antwort (ResponseStream) und gibt sie auf der Console aus
            Stream responseStream = response.GetResponseStream();
            StreamReader streamReader = new StreamReader(responseStream);
            string Ausgabe = streamReader.ReadToEnd();
            Console.WriteLine(streamReader.ReadToEnd());

            StreamWriter WStream = new StreamWriter("test.html");
            WStream.Write(Ausgabe);

            streamReader.Close();
            responseStream.Close();
            WStream.Close();
            #endregion

        }
    }

Für schnelle Hilfe wären wir sehr dankbar, da wir unter starkem Zeitdruck stehen.

Liebe Grüße,
Maatze
 
Hi.

Hab euren Code jetzt nicht zur gänze gelesen, aber wegen der Variante mit dem Cookie. Wie habt ihr es denn gemacht?

Wenn die betroffene Seite den Auth-Mechanismus über Cookies regelt, sollte folgender Ablauf klappen:

  • CookieContainer erstellen, welcher für jeden Request wiederverwendet wird
  • Login-Formular mit den notwendigen Formulardaten aufrufen
  • Die eigentlich gewollte Seite aufrufen

Sprich: Loggt euch auf der Seite ein, dann habt ihr die nötigen Daten im CookieContainer, und da ihr diesen bei jeden weiteren Aufruf wiederverwendet, seid ihr auch immer eingeloggt.

lg,..
 
Hey,

danke schonmal für die schnelle Antwort. Habe jetzt schnell unseren Code mit Cookie-Einsatz herausgekramt. Mit diesem Code bekommen wir allerdings immer einen Internen Serverfehler (500).

Code:
public static void Main()
        {
            // Cookie wird benötigt um die session von PHP aufrecht zu erhalten
            CookieContainer cookieContainer = new CookieContainer();
            string html;
            string loginData = "UserID=****&Password=****&Ziel=&Url=&Lizenz=&Titel=&Login=Login&Anmelden=Hier einloggen";

            // First hit the login page
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.zmp.de/login/default.asp");
            req.CookieContainer = cookieContainer;
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] loginDataBytes = encoding.GetBytes(loginData);
            req.ContentLength = loginDataBytes.Length;
            Stream stream = req.GetRequestStream();
            stream.Write(loginDataBytes, 0, loginDataBytes.Length);
            stream.Close();
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();

            // Packe den Content der Seite die hinter der Authenifizierung liegt
            req = (HttpWebRequest)HttpWebRequest.Create("http://www.zmp.de/milchvbereich/getpage_kopf_fuss.asp?Aufruf=l&Ziel=europapreise/grossbritannien.asp");
            req.CookieContainer = cookieContainer;
            req.Method = "GET";
            res = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(res.GetResponseStream());
            html = sr.ReadToEnd();

            //this.webBrowser1.DocumentText = html;
           // webBrowser1.Document.Body.InnerHtml = html;

        }

LG
Maatze
 

Neue Beiträge

Zurück