Saya berada dalam situasi di mana ketika saya mendapatkan kode HTTP 400 dari server, itu adalah cara yang sepenuhnya legal dari server memberi tahu saya apa yang salah dengan permintaan saya (menggunakan pesan dalam konten respons HTTP)
Namun, .NET HttpWebRequest memunculkan pengecualian ketika kode statusnya adalah 400.
Bagaimana saya menangani ini? Bagi saya 400 adalah sepenuhnya legal, dan agak membantu. Konten HTTP memiliki beberapa informasi penting tetapi pengecualian membuat saya keluar dari jalur saya.
.net
httpwebrequest
tukang masak
sumber
sumber
Jawaban:
Akan lebih baik jika ada beberapa cara mematikan "membuang kode yang tidak berhasil" tetapi jika Anda menangkap WebException Anda setidaknya dapat menggunakan respons:
Anda mungkin ingin merangkum bit "dapatkan saya respons meskipun itu bukan kode sukses" dalam metode terpisah. (Saya sarankan Anda masih melempar jika tidak ada respons, misalnya jika Anda tidak dapat terhubung.)
Jika respons kesalahan mungkin besar (yang tidak biasa), Anda mungkin ingin mengubah
HttpWebRequest.DefaultMaximumErrorResponseLength
untuk memastikan Anda mendapatkan seluruh kesalahan.sumber
Saya tahu ini sudah dijawab sejak lama, tetapi saya membuat metode penyuluhan untuk membantu orang lain yang datang ke pertanyaan ini.
Kode:
Pemakaian:
sumber
WebException.Response
bisa dan mungkinnull
. Anda harus memikirkan kembali jika ini masalahnya.HttpClient
, itu jauh lebih dapat dikonfigurasi, dan saya percaya itu adalah cara masa depan.((WebRequest) null).GetResponseWithoutException()
sebenarnya tidak akan menyebabkan aNullReferenceException
, karena dikompilasi dengan yang setaraWebRequestExtensions.GetResponseWithoutException(null)
, yang tidak akan menghasilkanNullReferenceException
, maka kebutuhan untuk validasi input.Menariknya,
HttpWebResponse.GetResponseStream()
yang Anda dapatkan dariWebException.Response
tidak sama dengan aliran respons yang akan Anda terima dari server. Di lingkungan kami, kami kehilangan respons server yang sebenarnya ketika kode status HTTP 400 dikembalikan ke klien menggunakanHttpWebRequest/HttpWebResponse
objek. Dari apa yang telah kita lihat, aliran respons yang terkait denganWebException's HttpWebResponse
dihasilkan di klien dan tidak termasuk badan respons dari server. Sangat frustasi, karena kami ingin mengirim pesan kembali kepada klien alasan permintaan yang buruk.sumber
Saya memiliki masalah serupa ketika mencoba terhubung ke layanan OAuth2 Google.
Saya akhirnya menulis POST secara manual, tidak menggunakan WebRequest, seperti ini:
Respons yang ditulis ke aliran respons berisi teks kesalahan spesifik yang Anda cari.
Secara khusus, masalah saya adalah bahwa saya meletakkan endline di antara potongan data yang disandikan dengan url. Ketika saya membawa mereka keluar, semuanya berhasil. Anda mungkin dapat menggunakan teknik serupa untuk terhubung ke layanan Anda dan membaca teks kesalahan respons aktual.
sumber
Coba ini (ini VB-Code :-):
sumber
Versi fungsi ekstensi asinkron:
sumber
Ini menyelesaikannya untuk saya:
https://gist.github.com/beccasaurus/929007/a8f820b153a1cfdee3d06a9c0a1d7ebfced8bb77
TL; DR:
Masalah:
localhost mengembalikan konten yang diharapkan, IP jarak jauh mengubah 400 konten menjadi "Permintaan Buruk"
Solusi:
Menambahkan
<httpErrors existingResponse="PassThrough"></httpErrors>
untukweb.config/configuration/system.webServer
menyelesaikan ini untuk saya; sekarang semua server (lokal & jarak jauh) mengembalikan konten yang sama persis (dihasilkan oleh saya) terlepas dari alamat IP dan / atau kode HTTP yang saya kembalikan.sumber