Saat ini saya memiliki penangan pesan di layanan API Web saya yang menimpa 'SendAsync' sebagai berikut:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//implementation
}
Di dalam kode ini saya perlu memeriksa nilai header permintaan kustom tambahan bernama MyCustomID
. Masalahnya adalah ketika saya melakukan hal berikut:
if (request.Headers.Contains("MyCustomID")) //OK
var id = request.Headers["MyCustomID"]; //build error - not OK
... Saya mendapatkan pesan kesalahan berikut:
Tidak dapat menerapkan pengindeksan dengan [] ke ekspresi tipe 'System.Net.Http.Headers.HttpRequestHeaders'
Bagaimana saya bisa mengakses satu header permintaan khusus melalui instance HttpRequestMessage
( Dokumentasi MSDN ) yang diteruskan ke metode yang diganti ini?
c#
asp.net-web-api
httprequest
atconway
sumber
sumber
request.Headers.Get("MyCustomID");
?Get' on the
tipe HttpRequestHeaders`. Pesan: "Tidak dapat menyelesaikan simbol 'Dapatkan'" diproduksi.Jawaban:
Coba sesuatu seperti ini:
Ada juga metode TryGetValues pada Header yang dapat Anda gunakan jika Anda tidak selalu dijamin memiliki akses ke header.
sumber
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
dan kemudianSome-Header: two
dalam permintaan yang sama. Beberapa bahasa secara diam-diam membuang "satu" tetapi itu tidak benar. Ada di RFC tapi saya terlalu malas untuk menemukannya sekarang.Baris di bawah ini
throws exception
jika kunci tidak ada.Bekerja di sekitar:
Sertakan System.Linq;
sumber
Untuk memperluas jawaban Youssef, saya menulis metode ini berdasarkan kekhawatiran Drew tentang header yang tidak ada, karena saya mengalami situasi ini selama pengujian unit.
Berikut ini contoh penggunaannya:
Lihat juga jawaban @ doguhan-uluca untuk solusi yang lebih umum.
sumber
Func
danAction
merupakan konstruksi tanda tangan delegasi umum yang dibangun dalam .NET 3.5 dan di atasnya. Saya akan senang mendiskusikan pertanyaan spesifik tentang metode ini, tetapi saya akan merekomendasikan untuk belajar tentang itu terlebih dahulu.HttpRequestMessage
diinisialisasi dengan koleksi Header kosong, yang bukan nol. Fungsi ini akhirnya mengembalikan nilai default jika permintaan nol.Buat metode baru - ' Mengembalikan nilai HTTP Header individu ' dan memanggil metode ini dengan nilai kunci setiap kali Anda perlu mengakses beberapa Nilai kunci dari HttpRequestMessage.
sumber
Untuk memperluas lebih lanjut pada solusi @ neontapir, berikut ini adalah solusi yang lebih umum yang dapat diterapkan pada HttpRequestMessage atau HttpResponseMessage secara setara dan tidak memerlukan ekspresi atau fungsi kode tangan.
Penggunaan sampel:
sumber
GetFirstHeaderValueOrDefault
memiliki dua parameter, jadi ia mengeluh tentang kehilangan param ketika memanggil sebagai penggunaan sampel.var myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
Apakah saya kehilangan sesuatu?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
didapat. Tidak ada argumen yang diberikan yang sesuai dengan parameter formal yang diperlukan 'headerKey' dari 'HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, string)'using HttpResponseMessageExtensions
file yang Anda coba gunakan ekstensi ini?Untuk ASP.Net Core ada solusi mudah jika ingin menggunakan param secara langsung dalam metode controller: Gunakan anotasi [FromHeader].
Info Tambahan: Dalam kasus saya "myParam" harus berupa string, int selalu 0.
sumber
Untuk ASP.NET Anda bisa mendapatkan header langsung dari parameter dalam metode controller menggunakan library / paket sederhana ini . Ini menyediakan
[FromHeader]
atribut seperti yang Anda miliki di ASP.NET Core :). Sebagai contoh:sumber
Solusi satu baris
sumber
request
itunull
? Itu juga mungkin. Atau bagaimana jikaMyCustomID
string kosong atau tidak sama denganfoo
? Tergantung pada konteksnya, jadi jawaban ini hanya menjelaskan caranya, dan semua validasi dan logika bisnis yang Anda perlu tambahkan sendirivarian modern :)
sumber