[c#] Einige HTTP-Header können bei Verwendung von System.Net.WebRequest nicht festgelegt werden



Answers

Ich stieß auf dieses Problem mit einem benutzerdefinierten Webclient. Ich denke, dass die Leute aufgrund verschiedener Möglichkeiten verwirrt werden. Wenn Sie WebRequest.Create() , können Sie in eine HttpWebRequest und die Eigenschaft zum Hinzufügen oder Ändern einer Kopfzeile verwenden. Wenn Sie eine WebHeaderCollection , können Sie die .Add("referer","my_url") .

Ex 1

WebClient client = new WebClient();
client.Headers.Add("referer", "http://stackoverflow.com");
client.Headers.Add("user-agent", "Mozilla/5.0");

Ex 2

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Referer = "http://stackoverflow.com";
request.UserAgent = "Mozilla/5.0";
response = (HttpWebResponse)request.GetResponse();
Question

Wenn ich versuche, ein HTTP-Header-Schlüssel / Wert-Paar für ein WebRequest Objekt WebRequest , WebRequest ich die folgende Ausnahme:

Dieser Header muss mit der entsprechenden Eigenschaft geändert werden

Ich habe versucht, neue Werte der Headers Sammlung hinzuzufügen, indem ich die Add () - Methode verwende, aber ich bekomme immer noch dieselbe Ausnahme.

webRequest.Headers.Add(HttpRequestHeader.Referer, "http://.com");

Ich kann das umgehen, indem ich das WebRequest-Objekt in eine HttpWebRequest-Instanz umwandle und Eigenschaften wie httpWebReq.Referer ="http://.com" , aber das funktioniert nur für eine Handvoll Header, die über Eigenschaften httpWebReq.Referer ="http://.com" werden.

Ich würde gerne wissen, ob es eine Möglichkeit gibt, feinere Kontrolle über das Ändern von Headern mit einer Anfrage für eine Remote-Ressource zu bekommen.




Sie können die WebRequest einfach an eine HttpWebRequest übergeben, die unten angezeigt wird:

var request = (HttpWebRequest)WebRequest.Create(myUri);

und dann, anstatt zu versuchen, die Header-Liste zu manipulieren, wenden Sie sie direkt in der Anfrage-Eigenschaft request.Referer an:

request.Referer = "yourReferer";

Diese Eigenschaften sind im Anforderungsobjekt verfügbar.




Die obigen Antworten sind alle in Ordnung, aber das Wesentliche des Problems ist, dass einige Header in eine Richtung gesetzt sind und andere auf andere Weise festgelegt sind. Siehe oben für 'eingeschränkte Kopfzeilen'. Für diese setzen Sie sie einfach als eine Eigenschaft. Für andere fügen Sie die Kopfzeile hinzu. Siehe hier.

    request.ContentType = "application/x-www-form-urlencoded";

    request.Accept = "application/json";

    request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + info.clientId + ":" + info.clientSecret);



Immer wenn Sie die Header einer HttpWebRequest , müssen Sie die entsprechenden Eigenschaften für das Objekt selbst verwenden, wenn sie vorhanden sind. Wenn Sie eine einfache WebRequest , müssen Sie sie zuerst an eine HttpWebRequest . Dann kann der Referrer in Ihrem Fall über ((HttpWebRequest)request).Referrer , so dass Sie den Header nicht direkt ändern müssen - setzen Sie einfach die Eigenschaft auf den richtigen Wert. ContentLength , ContentLength , ContentLength usw. müssen alle auf diese Weise festgelegt werden.

IMHO, dies ist ein Manko auf MS-Teil ... Setzen der Header über Headers.Add() sollte automatisch die entsprechende Eigenschaft hinter den Kulissen aufrufen, wenn das ist, was sie tun möchten.




Ich hatte die gleiche Ausnahme, als mein Code versuchte, den "Accept" Header-Wert wie folgt zu setzen:

WebRequest request = WebRequest.Create("http://someServer:6405/biprws/logon/long");
request.Headers.Add("Accept", "application/json");

Die Lösung war es, dies zu ändern:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://someServer:6405/biprws/logon/long");
request.Accept = "application/json";



Related