Saya mencoba mengatur Content-Type
header suatu HttpClient
objek seperti yang dipersyaratkan oleh API yang saya panggil.
Saya mencoba mengatur Content-Type
seperti di bawah ini:
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");
// ...
}
Ini memungkinkan saya untuk menambahkan Accept
header tetapi ketika saya mencoba menambahkannya Content-Type
melempar pengecualian berikut:
Nama tajuk yang disalahgunakan. Pastikan header permintaan digunakan bersama
HttpRequestMessage
, header respons denganHttpResponseMessage
, dan header konten denganHttpContent
objek.
Bagaimana saya bisa mengatur Content-Type
header dalam HttpClient
permintaan?
Jawaban:
Jenis konten adalah tajuk konten, bukan permintaan, itulah sebabnya mengapa ini gagal.
AddWithoutValidation
seperti yang disarankan oleh Robert Levy dapat berfungsi, tetapi Anda juga dapat mengatur tipe konten saat membuat konten permintaan itu sendiri (perhatikan bahwa cuplikan kode menambahkan "application / json" di dua tempat-untuk header Terima dan Tipe-Konten):sumber
Response.Content.Headers
akan bekerja sebagian besar waktu.Response.Content.Headers
untuk ASP.Net Web API juga tidak berfungsi, tetapi Anda dapat dengan mudah mengaturnya menggunakanHttpContext.Current.Response.ContentType
jika Anda perlu.Bagi mereka yang tidak melihat komentar Johns untuk solusi carlos ...
sumber
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml; charset=utf-8");
Jika Anda tidak keberatan dengan ketergantungan perpustakaan kecil, Flurl.Http [pengungkapan: Saya pembuatnya] menjadikan ini uber-sederhana. Its
PostJsonAsync
metode membutuhkan perawatan dari kedua serialisasi konten dan pengaturancontent-type
header, danReceiveJson
deserializes respon. Jikaaccept
tajuk diperlukan, Anda harus mengaturnya sendiri, tetapi Flurl juga menyediakan cara yang cukup bersih untuk melakukannya:Flurl menggunakan HttpClient dan Json.NET di bawah tenda, dan ini adalah PCL sehingga akan bekerja pada berbagai platform.
sumber
coba gunakan TryAddWithoutValidation
sumber
Misused header name
error dikonfirmasi dengan dotnet inti 2.2. Saya harus menggunakan stackoverflow.com/a/10679340/2084315 jawaban @ carlosfigueira ..Net mencoba untuk memaksa Anda untuk mematuhi standar tertentu, yaitu bahwa
Content-Type
sundulan hanya dapat ditentukan pada permintaan yang memiliki konten (misalnyaPOST
,PUT
, dll). Oleh karena itu, seperti yang telah ditunjukkan orang lain, cara yang lebih disukai untuk mengaturContent-Type
header adalah melaluiHttpContent.Headers.ContentType
properti.Dengan itu, API tertentu (seperti LiquidFiles Api , mulai 2016-12-19) mengharuskan pengaturan
Content-Type
header untukGET
permintaan. .Net tidak akan mengizinkan pengaturan tajuk ini pada permintaan itu sendiri - bahkan menggunakanTryAddWithoutValidation
. Selain itu, Anda tidak dapat menentukan aContent
untuk permintaan - bahkan jika panjangnya nol. Satu-satunya cara saya bisa mengatasi ini adalah dengan menggunakan refleksi. Kode (jika diperlukan orang lain) adalahEdit:
Seperti disebutkan dalam komentar, bidang ini memiliki nama yang berbeda dalam berbagai versi dll. Di kode sumber di GitHub , bidang ini saat ini bernama
s_invalidHeaders
. Contoh telah dimodifikasi untuk memperhitungkan ini sesuai saran dari @ David Thompson.sumber
Beberapa informasi tambahan tentang .NET Core (setelah membaca posting erdomke tentang pengaturan bidang pribadi untuk memasok jenis konten berdasarkan permintaan yang tidak memiliki konten) ...
Setelah men-debug kode saya, saya tidak dapat melihat bidang pribadi untuk diatur melalui refleksi - jadi saya pikir saya akan mencoba untuk membuat ulang masalah.
Saya telah mencoba kode berikut menggunakan .Net 4.6:
Dan, seperti yang diharapkan, saya mendapatkan pengecualian agregat dengan konten
"Cannot send a content-body with this verb-type."
Namun, jika saya melakukan hal yang sama dengan .NET Core (1.1) - Saya tidak mendapatkan pengecualian. Permintaan saya dengan senang hati dijawab oleh aplikasi server saya, dan jenis konten diambil.
Saya terkejut tentang hal itu, dan saya harap ini membantu seseorang!
sumber
Panggil
AddWithoutValidation
alih-alihAdd
(lihat tautan MSDN ini ).Atau, saya menduga API yang Anda gunakan benar-benar hanya memerlukan ini untuk permintaan POST atau PUT (bukan permintaan GET biasa). Dalam hal itu, ketika Anda menelepon
HttpClient.PostAsync
dan meneruskanHttpContent
, atur ini padaHeaders
propertiHttpContent
objek itu.sumber
Bagi mereka yang bermasalah
charset
Saya punya kasus yang sangat khusus bahwa penyedia layanan tidak menerima charset, dan mereka menolak untuk mengubah substruktur untuk mengizinkannya ... Sayangnya HttpClient sedang mengatur header secara otomatis melalui StringContent, dan tidak masalah jika Anda memasukkan null atau Encoding.UTF8, itu akan selalu mengatur charset ...
Hari ini saya berada di tepi untuk mengubah sub-sistem; pindah dari HttpClient ke hal lain, bahwa sesuatu muncul di benak saya ..., mengapa tidak menggunakan refleksi untuk mengosongkan "charset"? ... Dan bahkan sebelum saya mencobanya, saya memikirkan cara, "mungkin saya bisa mengubahnya setelah inisialisasi", dan itu berhasil.
Inilah cara Anda dapat mengatur header "application / json" tanpa "; charset = utf-8".
Catatan: The
null
nilai berikut tidak akan bekerja, dan append "; charset = utf-8"EDIT
@DesertFoxAZ menyarankan bahwa kode berikut juga dapat digunakan dan berfungsi dengan baik. (tidak mengujinya sendiri)
sumber
Itu semua yang Anda butuhkan.
Dengan menggunakan Newtonsoft.Json, jika Anda memerlukan konten sebagai string json.
sumber
HttpMessageHandler handler = new WebRequestHandler(); HttpResponseMessage result; using (var client = (new HttpClient(handler, true))) { result = client.PostAsync(fullUri, content).Result; }
Oke, ini bukan HTTPClient tetapi jika Anda dapat menggunakannya, WebClient cukup mudah:
sumber
Anda dapat menggunakan ini akan berhasil!
sumber
Saya merasa paling sederhana dan mudah dipahami dengan cara berikut:
sumber
Anda perlu melakukannya seperti ini:
sumber