Saya mungkin melewatkan sesuatu yang jelas di sini.
Saya menggunakan HttpClient
lemparan HttpRequestException
yang berisi StatusCode
dalam string Pesan.
Bagaimana saya bisa mengaksesnya StatusCode
?
Edit : Info lebih lanjut, saya menulis pertanyaan ini dengan terburu-buru.
Saya menggunakan HttpClient
untuk mengakses API lain dalam proyek WebApi saya. Ya, saya tahu mengapa saya menelepon EnsureSuccessStatusCode()
. Saya ingin menyebarkan beberapa kesalahan ke hilir seperti 404 dan 403.
Yang saya inginkan adalah secara konsisten bertransformasi HttpRequestException
menjadi HttpResponseException
menggunakan custom ExceptionFilterAttribute
.
Sayangnya, HttpRequestException
tidak ada info tambahan yang bisa saya gunakan selain pesan. Saya berharap untuk mengungkap StatusCode
dalam bentuk mentah (int atau enum).
Sepertinya saya bisa:
- Gunakan pesan untuk mengganti kode status (bleh)
- Atau buat versi saya dari EnsureSuccessStatusCode dan lempar pengecualian yang sebenarnya bisa digunakan.
Jawaban:
Kode status diteruskan sebagai bagian dari string
HttpRequestException
sehingga Anda tidak dapat memulihkannya dari pengecualian tersebut saja.Desain
System.Net.Http
mengharuskan Anda mengaksesHttpResponseMessage.StatusCode
alih-alih menunggu pengecualian.http://msdn.microsoft.com/en-us/library/system.net.http.httpresponsemessage(v=vs.110).aspx
Jika Anda sekarang mengikuti panduan Microsoft , pastikan Anda memahami dengan jelas mengapa panduan ini meminta Anda untuk menelepon
HttpResponseMessage.EnsureSucessStatusCode
. Jika Anda tidak memanggil fungsi itu, seharusnya tidak ada pengecualian.sumber
Untuk apa nilainya, orang ini melakukan sesuatu yang pintar: https://social.msdn.microsoft.com/Forums/vstudio/en-US/dc9bc426-1654-4319-a7fb-383f00b68def/c-httpresponsemessage-throws-exception-httprequestexception -webexception-the-remote-name? forum = csharpgeneral
Dalam kasus di mana saya membutuhkan properti status pengecualian, saya dapat melakukan ini:
catch (HttpRequestException requestException) { if (requestException.InnerException is WebException webException && webException.Status == WebExceptionStatus.NameResolutionFailure) { return true; } return false; }
sumber
requestException.InnerException
adalah null jadi ini tidak akan berfungsiSeperti yang disebutkan oleh orang lain, juga bukan praktik yang baik untuk mendapatkan StatusCode dari HttpRequestException, hal yang sama dapat dilakukan sebelumnya dengan HttpResponseMessage.StatusCode setelah memeriksa HttpResponseMessage.IsSuccessStatusCode
Bagaimanapun jika karena beberapa kendala / persyaratan seseorang harus membaca StatusCode, Ada dua solusi
Di bawah ini adalah kode dalam System.Net.Http.HttpResponseMessage Dimana SR.net_http_message_not_success_statuscode = "Kode status respon tidak menunjukkan keberhasilan: {0} ({1})."
public HttpResponseMessage EnsureSuccessStatusCode() { if (!this.IsSuccessStatusCode) { if (this.content != null) { this.content.Dispose(); } throw new HttpRequestException(string.Format(CultureInfo.InvariantCulture, SR.net_http_message_not_success_statuscode, new object[] { (int)this.statusCode, this.ReasonPhrase })); } return this; }
sumber
Ini berhasil untuk saya
var response = ex.Response; var property = response.GetType().GetProperty("StatusCode"); if ( property != null && (HttpStatusCode)property.GetValue(response) == HttpStatusCode.InternalServerError)
sumber
Mungkin saya terlambat disini:
Dari .NET 5.0,
HttpRequestException
memilikiStatusCode
properti yang akan memiliki nilai jika pengecualian mewakili hasil yang tidak berhasil, jika tidak null. Jadi Anda bisa menggunakan sebagai berikut:try { // Your code } catch (HttpRequestException httpRequestException) { if ((int)httpRequestException.StatusCode == 401) { // Show unauthorized error message } else { // Other error message } }
Untuk lebih jelasnya ada disini
sumber