HttpWebRequest-Antwort erzeugt HTTP 422. Warum?
Ich versuche, programmgesteuert eine POST-Anfrage an einen Webserver zu senden, um mich anzumelden, und dann andere Anfragen auszuführen, die eine Anmeldung erfordern.
Dies ist mein Code:
byte[] data = Encoding.UTF8.GetBytes(
String.Format(
"login={0}&password={1}&authenticity_token={2}"
+"&login_submit=Entra&remember_me=1",
HttpUtility.UrlEncode(username), HttpUtility.UrlEncode(password),
HttpUtility.UrlEncode(token)));
//Create HTTP-request for login
HttpWebRequest request =
(HttpWebRequest)HttpWebRequest.Create("http://www.xxx.xx/xx/xx");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
request.CookieContainer = new CookieContainer();
request.Accept = "application/xml,application/xhtml+xml,text/html;
+"q=0.9,text/plain ;q=0.8,image/png,*/*;q=0.5";
request.Referer = "http://www.garzantilinguistica.it/it/session";
request.Headers.Add("Accept-Language", "de-DE");
request.Headers.Add("Origin", "http://www.xxx.xx");
request.UserAgent = "C#";
request.Headers.Add("Accept-Encoding", "gzip, deflate");
Nach dem Absenden der Anfrage
//Send post request
var requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Flush();
requestStream.Close();
... Ich möchte die Antwort des Servers erhalten:
//Get Response
StreamReader responseStreamReader = new
StreamReader(
request.GetResponse().GetResponseStream()); //WebException: HTTP 422!
string content = responseStreamReader.ReadToEnd();
Dieser Code löst die WebException aus, die besagt, dass der Server mit @ geantwortet haHTTP 422 (nicht verarbeitbare Entität aufgrund semantischer Fehler)
Dann habe ich (mit einem TCP / IP-Sniffer) die Anforderungen meines Programms und des Browsers verglichen (was natürlich eine gültige POST-Anforderung erzeugt und die richtige Antwort erhält).
(1) Anfrage meines Programms:
POST /it/session HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Accept: application/xml,application/xhtml+xml,text/html;
q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Referer: http://www.garzantilinguistica.it/it/session
Accept-Language: de-DE
Origin: http://www.garzantilinguistica.it
User-Agent: Test
Accept-Encoding: gzip, deflate
Host: www.garzantilinguistica.it
Content-Length: 148
Expect: 100-continue
Connection: Keep-Alive
HTTP/1.1 100 Continue
login=thespider14%40hotmail.com&password=xxxxx&authenticity_token=4vLgtwP3nFNg4NeuG4MbUnU7sy4z91Wi8WJXH0POFmg%3d&login_submit=Entra&remember_me=1
(2) Die Anfrage des Browsers:
POST /it/session HTTP/1.1
Host: www.garzantilinguistica.it
Referer: http://www.garzantilinguistica.it/it/session
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,
text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: de-DE
Origin: http://www.garzantilinguistica.it
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Cookie: __utma=244184339.652523587.1275208707.1275208707.1275211298.2; __utmb=244184339.20.10.1275211298; __utmc=244184339; __utmz=244184339.1275208707.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _garzanti2009_session=BAh7CDoPc2Vzc2lvbl9pZCIlZDg4MWZjNjg2YTRhZWE0NDQ0ZTJmMTU2YWY4ZTQ1NGU6EF9jc3JmX3Rva2VuIjFqRWdLdll3dTYwOTVVTEpNZkt6dG9jUCtaZ0o4V0FnV2V5ZnpuREx6QUlZPSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsGOgplcnJvciIVbG9naW4gbm9uIHZhbGlkbwY6CkB1c2VkewY7CFQ%3D--4200fa769898dd156faa49e457baf660cf068d08
Content-Length: 144
Connection: keep-alive
authenticity_token=jEgKvYwu6095ULJMfKztocP%2BZgJ8WAgWeyfznDLzAIY%3D&login=thespider14%40hotmail.com&password=xxxxxx&remember_me=1&commit=Entra
HTTP/1.1 302 Found
Kann jemand helfen, um zu verstehen, welcher Teil der Anfrage mir fehlt oder worin der Hauptunterschied zwischen dem Browser und meiner Anfrage besteht? Warum bekomme ich das 422?
BEARBEITEN
Ich habe festgestellt, dass meine Anfrage ein @ enthälExpect
-Header mit dem Wert 100-continue, während der Browser dies nicht tut. Ich setze dasrequest.Expect
-Eigenschaft zunull
und zu""
. Aber ich konnte es einfach nicht loswerden. Irgendwelche Vorschläge? Kann dies die Wurzel allen Übels sein?
BEARBEITEN
Endlich habe ich das @ entferExpect
-Header. Aber es hat nicht geholfen. Irgendwelche Ideen? Ich habe den CookieContainer durch Setzen von @ aktivie
request.CookieContainer = new CookieContainer();
Aber ich kann den Cookie-Header im HTTP-Trace nicht sehen. Warum