Frage zu WebRequest

andreas_gierisch

Erfahrenes Mitglied
[VC# 2005 Express]

Hallo,

ich möchte auf einer Website automatisch eine Form ausfüllen und die Werte per POST senden. Ich habe bereits herausgefunden, welcher Stream übertragen wird, wenn ich es per Hand ausfülle und mit Submit-Button abschicke:
  1. POST /popup.php?user=xxx HTTP/1.1
  2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
  3. Referer: http://www.123.de/popup.php?user=xxx
  4. Accept-Language: de
  5. Content-Type: application/x-www-form-urlencoded
  6. UA-CPU: x86
  7. Accept-Encoding: gzip, deflate
  8. User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
  9. Host: www.123.de
  10. Content-Length: 9
  11. Connection: Keep-Alive
  12. Cache-Control: no-cache
  13. Cookie: //jede Menge Werte
  14. //leer
  15. name = 1234
Nun möchte ich dies per WebRequest machen. Müssen dazu oben stehende Werte komplett und in gleicher Reihenfolge übertragen werden?
 

Alexander Schuc

crazy-weasel
Hallo.

Die erste Zeile ist muss. So muss nunmal eine HTTP Anfrage beginnen. Der Host-Header wird auch zwingend sein, wenn mehrere Websites unter der selben IP erreichbar sind, kennt sich der Webserver sonst nicht aus beziehungsweise wird er dir die falsche Seite zurückliefern.

Referer könnte nötig sein, wenn sich das Script welches du aufrufst darauf verlässt das es kommt und es für diverse Prüfungen benutzt. Ist aber kein Zwang, in vielen Browsern kannst das ja auch unterdrücken.

Content-Length, Content-Type wirst brauchen, vorallem bei einem HTTP-POST. (Content-Length gibt an, wie lang die Zeichenkette am Ende ist, ohne deren richtigen Wert, wird der Zugriff fehlschlagen.)

Mehr zu HTTP steht u.a. in Wikipedia..
HTTP

..und hier sind nochmal die HTTP-Header erklärt..
HTTP-Header

Wennst das durch hast wirst deine Fragen selbst beantworten können.. :)

lg, Alex
 

andreas_gierisch

Erfahrenes Mitglied
So weit bin ich ja auch schon denk ich.
Der HttpWebRequest müsste demnach wie folgt funktionieren:

Code:
string name = "1234";

HttpWebRequest WReqCode = WebRequest.Create(webBrowser.Url.ToString()) as HttpWebRequest;
WReqCode.ServicePoint.Expect100Continue = false;
WReqCode.Method = "POST";
WReqCode.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
WReqCode.Referer = webBrowser.Url.ToString();
WReqCode.Headers.Add("Accept-Language", "de");
WReqCode.ContentType = "application/x-www-form-urlencoded";
WReqCode.ContentLength = name.Length;
WReqCode.Headers.Add("UA-CPU", "x86");
WReqCode.Headers.Add("Accept-Encoding", "gzip, deflate");
WReqCode.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)";
WReqCode.Headers.Add("Cache-Control", "no-cache");
WReqCode.Headers.Add("Cookie", "");
   
StreamWriter requestCode = new StreamWriter(WReqCode.GetRequestStream());
requestCode.Write(name);
requestCode.Close();

HttpWebResponse WResCode = (HttpWebResponse)WReqCode.GetResponse();
StreamReader responseCode = new StreamReader(WResCode.GetResponseStream());
string response = responseCode.ReadToEnd();
responseCode.Close();

Kurze Erklärung was ich genau machen will:
Ich hab in meiner Anwendung einen Webbrowser eingebaut (fertige Komponente von Visual C#). Dort hab ich eine Website laufen auf der ich eingeloggt bin und sich ein Formular befindet. Den Inhalt möchte ich gern per HttpRequest senden, was grundsätzlich mit oben stehendem Code funktionieren sollte. Allerdings bekomme ich als Response nicht die gewünschte Bestätigungsseite, sondern die Startseite mit Login-Aufforderung. Wie kann ich das am besten lösen, bzw. was muss ich dem Cookie-Header übergeben?
 
K

Konstantin Denerz

Hallo,

also wenn du mit der WebBrowser-Komponente von .Net 2.0 arbeitest, dann kannst du doch auch damit das Formular füllen (und noch mehr). Das geht sogar noch einfacher, als mit HttpWebRequest und es ist entstehen weniger Fehler.


Gruß Konstantin
 

andreas_gierisch

Erfahrenes Mitglied
Ich hab gewusst, dass die Antwort kommt ;)
Das hab ich natürlich schon so gemacht und es hat alles wunderbar funktioniert. Allerdings würd ich das jetzt gern mit einem HttpWebRequest versuchen. Es geht mir einzig und allein darum, neue Kenntnisse anzueignen, auch wenn sich am Ende rausstellt dass der WebRequest weniger effektiv ist.
 

Alexander Schuc

crazy-weasel
Warum weniger effektiv? Sind 2 verschiedene Anwendungsgebiete.

Die Cookies musst nicht selber in den Header schreiben, da gibts ne andere Möglichkeit.

Seite mit Cookies aufrufen ?!

Deine Content-Length ist auch falsch, beziehungsweise deine Post-Daten.

C#:
string name = "name=1234";
wäre besser..
 

andreas_gierisch

Erfahrenes Mitglied
Effektiv war wohl eher das falsche Wort. Hätte wohl eher "weniger fehleranfällig" schreiben sollen, bezogen auf den vorherigen Post.
Die Stringdaten sind falsch, hab ich auch gerade gesehen. Im Quelltext bei mir steht string name = "name=1234". Sorry für den Fehler oben.

Ich werd mir mal deinen Link durchlesen und das versuchen. Danke!
 

andreas_gierisch

Erfahrenes Mitglied
Ok, hab die Cookies jetzt folgendermaßen gesetzt:

Code:
CookieContainer cookies = new CookieContainer();
...WebRequest erstellen und absenden
...WebResponse erstellen und empfangen

foreach(Cookie c in response.Cookies)
{
   cookies.Add(c);
}

...neuen WebRequest erstellen und CookieContainer zuweisen

Funktioniert erstmal soweit.