Ich versuche, den Content-Type
Header eines HttpClient
Objekts so festzulegen, wie es für eine von mir aufgerufene API erforderlich ist.
Ich habe versucht, Content-Type
Folgendes einzustellen:
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("http://example.com/");
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
// ...
}
Ich kann den Accept
Header hinzufügen, aber wenn ich versuche, ihn hinzuzufügen Content-Type
, wird die folgende Ausnahme ausgelöst:
Missbrauchter Headername. Stellen Sie sicher, dass Anforderungsheader mit
HttpRequestMessage
, Antwortheader mitHttpResponseMessage
und Inhaltsheader mitHttpContent
Objekten verwendet werden.
Wie kann ich den Content-Type
Header in einer HttpClient
Anfrage setzen?
Antworten:
Der Inhaltstyp ist eine Kopfzeile des Inhalts und nicht der Anforderung, weshalb dies fehlschlägt.
AddWithoutValidation
Wie von Robert Levy vorgeschlagen, funktioniert dies möglicherweise, aber Sie können den Inhaltstyp auch festlegen, wenn Sie den Anforderungsinhalt selbst erstellen (beachten Sie, dass das Code-Snippet an zwei Stellen "application / json" hinzufügt - für Header "Akzeptieren" und "Inhaltstyp"):quelle
Response.Content.Headers
funktioniert die meiste Zeit.Response.Content.Headers
für die ASP.Net-Web-API gesehen habe, haben auch nicht funktioniert, aber Sie können sieHttpContext.Current.Response.ContentType
bei Bedarf einfach festlegen .Für diejenigen, die Johns Kommentar zur Carlos-Lösung nicht gesehen haben ...
quelle
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8");
Wenn Ihnen eine kleine Bibliotheksabhängigkeit nichts ausmacht, macht Flurl.Http [Offenlegung: Ich bin der Autor] dies sehr einfach. Die
PostJsonAsync
Methode kümmert sich sowohl um die Serialisierung des Inhalts als auch um das Festlegen descontent-type
Headers undReceiveJson
deserialisiert die Antwort. Wenn deraccept
Header benötigt wird, müssen Sie dies selbst festlegen, aber Flurl bietet auch eine ziemlich saubere Möglichkeit, dies zu tun:Flurl verwendet HttpClient und Json.NET unter der Haube und ist eine PCL, sodass es auf einer Vielzahl von Plattformen funktioniert.
quelle
Versuchen Sie, TryAddWithoutValidation zu verwenden
quelle
Misused header name
Fehler wird mit dotnet core 2.2 bestätigt. Ich musste @ carlosfigueiras Antwort stackoverflow.com/a/10679340/2084315 verwenden ..Net versucht , Sie zu zwingen , bestimmte Standards zu folgen, nämlich , dass der
Content-Type
Header kann nur auf Anfragen angegeben werden, den Inhalt (zBPOST
,PUT
usw.). Daher ist, wie andere angegeben haben, die bevorzugte Methode zum Festlegen desContent-Type
Headers dieHttpContent.Headers.ContentType
Eigenschaft.Für bestimmte APIs (z. B. die LiquidFiles- API vom 19.12.2016) muss der
Content-Type
Header für eineGET
Anforderung festgelegt werden. .Net erlaubt es nicht, diesen Header für die Anfrage selbst zu setzen - auch nicht mitTryAddWithoutValidation
. Darüber hinaus können SieContent
für die Anforderung kein a angeben, auch wenn diese keine Länge hat. Die einzige Möglichkeit, dies zu umgehen, bestand darin, auf Reflexion zurückzugreifen. Der Code (falls es jemand anderes braucht) istBearbeiten:
Wie in den Kommentaren erwähnt, hat dieses Feld in verschiedenen Versionen der DLL unterschiedliche Namen. Im Quellcode von GitHub wird das Feld derzeit benannt
s_invalidHeaders
. Das Beispiel wurde geändert, um dies gemäß dem Vorschlag von @David Thompson zu berücksichtigen.quelle
Einige zusätzliche Informationen zu .NET Core (nachdem Sie den Beitrag von erdomke zum Festlegen eines privaten Felds gelesen haben, um den Inhaltstyp für eine Anforderung ohne Inhalt anzugeben) ...
Nach dem Debuggen meines Codes kann ich das private Feld, das durch Reflektion festgelegt werden soll, nicht sehen. Daher dachte ich, ich würde versuchen, das Problem neu zu erstellen.
Ich habe den folgenden Code mit .Net 4.6 ausprobiert:
Und wie erwartet bekomme ich eine aggregierte Ausnahme mit dem Inhalt
"Cannot send a content-body with this verb-type."
Wenn ich jedoch dasselbe mit .NET Core (1.1) mache - mache, bekomme ich keine Ausnahme. Meine Anfrage wurde von meiner Serveranwendung sehr gerne beantwortet und der Inhaltstyp wurde aufgegriffen.
Ich war angenehm überrascht und hoffe, dass es jemandem hilft!
quelle
Anruf
AddWithoutValidation
stattAdd
(siehe diesen MSDN-Link ).Alternativ denke ich, dass die API, die Sie verwenden, dies wirklich nur für POST- oder PUT-Anforderungen erfordert (keine gewöhnlichen GET-Anforderungen). Wenn Sie in diesem Fall ein aufrufen
HttpClient.PostAsync
und übergebenHttpContent
, legen Sie dies für dieHeaders
Eigenschaft diesesHttpContent
Objekts fest.quelle
Für diejenigen, die sich Sorgen machen
charset
Ich hatte einen ganz besonderen Fall, dass der Dienstanbieter keinen Zeichensatz akzeptierte und sich weigerte, die Unterstruktur zu ändern, um dies zuzulassen ... Leider setzte HttpClient den Header automatisch über StringContent, und egal, ob Sie null oder Encoding.UTF8 übergeben, es wird immer der Zeichensatz eingestellt ...
Heute war ich am Rande, das Subsystem zu ändern; Als ich von HttpClient zu etwas anderem überging, kam mir etwas in den Sinn ..., warum nicht die Reflexion verwenden, um den "Zeichensatz" zu leeren? ... Und bevor ich es überhaupt probiere, habe ich mir überlegt, "vielleicht kann ich es nach der Initialisierung ändern", und das hat funktioniert.
So können Sie den genauen Header "application / json" ohne "; charset = utf-8" setzen.
Hinweis: Der
null
folgende Wert funktioniert nicht und hängt "; charset = utf-8" an.BEARBEITEN
@DesertFoxAZ schlägt vor, dass auch der folgende Code verwendet werden kann und gut funktioniert. (habe es nicht selbst getestet)
quelle
Es ist alles was Sie brauchen.
Wenn Sie Newtonsoft.Json verwenden, benötigen Sie einen Inhalt als JSON-Zeichenfolge.
quelle
HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; }
Ok, es ist kein HTTPClient, aber wenn Sie es verwenden können, ist WebClient ganz einfach:
quelle
Sie können dies verwenden, es wird Arbeit sein!
quelle
Ich finde es am einfachsten und am leichtesten zu verstehen:
quelle
Sie müssen es so machen:
quelle