5

Ich entwickle C# \ XAML Metro-Ui-Anwendung. Ich möchte einen Dienst anrufen und dafür HttpWebRequest verwenden. Die vorherige Ausführung von HttpWebRequest enthält ContentLength und UserAgent Eigenschaften. Aber Realisierung für WinRT hat es nicht. Ich habe versucht, den in dieser post beschriebenen Ansatz zu verwenden. Es funktioniert für UserAgent aber nicht für ContentLength. Ich habe versucht HeadersWie Header zu HttpWebRequest in Windows8-Anwendung hinzufügen?

request.Headers["Content-length"] = Length; 
request.Headers["User-agent"] = UserAgent; 

erhielt aber die Ausnahme „um die‚Content-length‘Header muss die entsprechende Eigenschaft oder Methode geändert werden.“

Heiß ist es möglich, Headers in HttpWebRequest realisiert in WinRT zu setzen?

+0

Wenn Sie die Einstellung Inhalt Länge entfernen, funktioniert es? Es ist möglich, dass Sie in der HttpWepRequest-Funktion keine Inhaltslänge festlegen können, da diese basierend auf dem von Ihnen gesendeten Inhalt berechnet wird. –

+0

@LarryOsterman Nein. Außerdem muss ich die 'Content-type' Eigenschaft festlegen. Also sollte ich es auch kommentieren. Für den Ansatz, der über den Link beschrieben wird: Wenn ich diese Eigenschaften kommentiert habe, erhalte ich eine '400 schlechte Anfrage'. Als ich diese für 'HttpWebRequest' kommentiert habe, bekomme ich webexception' Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung wurde unerwartet geschlossen. ' – RredCat

+0

Hmmm. Ich kann sehen, HttpWebRequest Blocking-Einstellung Content-Länge (da es Content-Länge berechnen kann). Die schlechte Anfrage impliziert, dass etwas mit der gesendeten Nachricht nicht stimmt. Was zeigt Fiddler, dass Sie gesendet haben? –

Antwort

12

HttpWebRequest hat einen semi-deprecated Status unter WinRT. Einige Headerwerte, die zuvor auf früheren .NET-Plattformen geändert werden konnten, können nicht mehr geändert werden.

Es scheint, dass HttpClient der neue und verbesserte Ersatz für HttpWebRequest mit einer einfachen API und voller Async-Unterstützung ist.

Da Sie Content-Length angeben möchten, nehme ich an, Sie versuchen, POST oder PUT etwas auf dem Server. In diesem Fall sollten Sie PostAsync() oder PutAsync() entsprechend verwenden.

var req = new HttpClient(); 
    req.DefaultRequestHeaders.Add("User-agent", UserAgent); 
    req.DefaultRequestHeaders.Add("Content-length", Length); 
    return await req.PostAsync(RequestURL, Body); 

Sie wahrscheinlich nicht wirklich brauchen, die Content-Length-Header angeben, da sie automatisch durch diese Verfahren auf der Grundlage der tatsächlichen Länge des Körpers aufgenommen werden wird, aber man kann es so oder so versuchen.

+0

Ja .. Sie haben Recht .. Vielen Dank für Ihre Antwort. Ich spiele mit etwas wie .. Aber wie ich sehen kann, ist 'Body'' HttpContent' Typ, richtig? Und du hast deine Parameter angegeben, oder? Könntest du erklären, wie du Params in "HttpContent" gesetzt hast? – RredCat

+0

Ich habe es gefunden. Ich habe gerade die Parameter-Zeichenfolge nach 'ASCII' codiert. Aber es ist keine vollständige Lösung. Ich habe im Kommentar zu @Larry Osterman erwähnt, dass ich ein Problem mit der Einstellung "ContentType" hatte. Ich habe es gefunden - 'content.Headers.ContentType = new MediaTypeHeaderValue ("application/x-www-form-urlencoded");' Wie auch immer, ich habe dich als Antwort markiert, weil du kurz davor bist zu antworten) – RredCat

Verwandte Themen