Pertimbangkan kode berikut, di mana BaseAddress
mendefinisikan jalur URI parsial.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api");
var response = await client.GetAsync("/resource/7");
}
Saya berharap ini melakukan GET
permintaan untuk http://something.com/api/resource/7
. Tapi ternyata tidak.
Setelah beberapa pencarian, saya menemukan pertanyaan dan jawaban ini: HttpClient dengan BaseAddress . Sarannya adalah untuk menempatkan /
pada akhir BaseAddress
.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api/");
var response = await client.GetAsync("/resource/7");
}
Itu masih tidak berhasil. Berikut dokumentasinya: HttpClient.BaseAddress Apa yang terjadi di sini?
c#
.net
dotnet-httpclient
Perisai Timothy
sumber
sumber
Jawaban:
Ternyata, dari empat kemungkinan permutasi termasuk atau tidak termasuk trailing atau memimpin garis miring pada
BaseAddress
dan relatif URI beralih keGetAsync
metode - atau metode lain mana punHttpClient
- hanya satu permutasi yang berfungsi. Anda harus menempatkan garis miring di akhirBaseAddress
, dan Anda tidak boleh menempatkan garis miring di awal URI relatif Anda, seperti dalam contoh berikut.Meskipun saya menjawab pertanyaan saya sendiri, saya pikir saya akan berkontribusi solusi karena, sekali lagi, perilaku tidak ramah ini tidak terdokumentasi. Rekan saya dan saya menghabiskan sebagian besar hari berusaha memperbaiki masalah yang akhirnya disebabkan oleh keanehan ini
HttpClient
.sumber
RestClient
, itu hampir tidak terlihat dan tidak mendapat perhatian sama sekali, dan saya tidak pernah melihat url penuh di breakpoints saya dll.Creating a new HttpClient instance per request can exhaust the available sockets
). Jadi Anda harus mempertimbangkan untuk menghapus Using ().Resolusi Referensi dijelaskan oleh RFC 3986 Uniform Resource Identifier (URI): Generic Syntax . Dan itulah tepatnya cara kerjanya. Untuk mempertahankan jalur URI dasar, Anda perlu menambahkan garis miring di akhir URI dasar dan menghapus garis miring pada awal URI relatif.
Jika basis URI berisi jalur yang tidak kosong, gabungkan prosedur membuang itu bagian terakhir (setelah terakhir
/
). Bagian yang relevan :Jika URI relatif dimulai dengan garis miring, itu disebut URI relatif jalur absolut. Dalam hal ini prosedur gabungan mengabaikan semua jalur URI dasar. Untuk informasi lebih lanjut, periksa 5.2.2. Ubah bagian Referensi .
sumber
Terjadi masalah dengan HTTPClient, bahkan dengan saran masih belum dapat mengautentikasi. Ternyata saya membutuhkan trailing '/' di jalur relatif saya.
yaitu
sumber
Atau - jangan gunakan
BaseAddress
sama sekali. Masukkan seluruh URL ke dalamGetAsync
()sumber