Jawaban:
Mungkin kira-kira seperti ini ...
try
{
// ...
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
var response = ex.Response as HttpWebResponse;
if (response != null)
{
Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
}
else
{
// no http status code available
}
}
else
{
// no http status code available
}
}
Dengan menggunakan operator bersyarat nol ( ?.
) Anda bisa mendapatkan kode status HTTP dengan satu baris kode:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
Variabel status
akan berisi HttpStatusCode
. Ketika ada kegagalan yang lebih umum seperti kesalahan jaringan di mana tidak ada kode status HTTP yang dikirim maka status
akan menjadi nol. Dalam hal ini Anda dapat memeriksa ex.Status
untuk mendapatkan WebExceptionStatus
.
Jika Anda hanya ingin string deskriptif untuk login jika terjadi kegagalan, Anda dapat menggunakan operator null-coalescing ( ??
) untuk mendapatkan kesalahan yang relevan:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
Jika pengecualian dilemparkan sebagai akibat dari kode status HTTP 404 string akan berisi "NotFound". Di sisi lain, jika server sedang offline, string akan berisi "ConnectFailure" dan seterusnya.
(Dan bagi siapa pun yang ingin tahu cara mendapatkan kode HTTP subtatus. Itu tidak mungkin. Ini adalah konsep Microsoft IIS yang hanya masuk di server dan tidak pernah dikirim ke klien.)
?.
operator itu awalnya bernama operator propagasi nol atau operator kondisional nol selama rilis pratinjau. Tetapi pemanen Atlassian memberi peringatan untuk menggunakan operator propagasi nol dalam skenario seperti itu. Senang mengetahui bahwa itu juga disebut operator null-kondisional.
ini hanya berfungsi jika WebResponse adalah HttpWebResponse.
try
{
...
}
catch (System.Net.WebException exc)
{
var webResponse = exc.Response as System.Net.HttpWebResponse;
if (webResponse != null &&
webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
MessageBox.Show("401");
}
else
throw;
}
(Saya menyadari bahwa pertanyaannya sudah lama, tetapi ini termasuk salah satu hit teratas di Google.)
Situasi umum di mana Anda ingin mengetahui kode respons ada dalam penanganan pengecualian. Pada C # 7, Anda dapat menggunakan pencocokan pola untuk benar-benar hanya memasukkan klausa tangkapan jika pengecualian cocok dengan predikat Anda:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
Ini dapat dengan mudah diperluas ke tingkat lebih lanjut, seperti dalam kasus ini di mana WebException
sebenarnya pengecualian dalam yang lain (dan kami hanya tertarik 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Akhirnya: perhatikan bagaimana tidak perlu melemparkan kembali pengecualian dalam klausa tangkapan ketika tidak sesuai dengan kriteria Anda, karena kami tidak memasukkan klausa di tempat pertama dengan solusi di atas.
Anda dapat mencoba kode ini untuk mendapatkan kode status HTTP dari WebException. Ia bekerja di Silverlight juga karena SL tidak memiliki WebExceptionStatus.ProtocolError didefinisikan.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? atau lebih baik HttpStatusCode?
( nullable )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Saya tidak yakin apakah ada tetapi jika ada properti seperti itu tidak akan dianggap dapat diandalkan. A WebException
dapat dipecat karena alasan selain kode kesalahan HTTP termasuk kesalahan jaringan sederhana. Mereka tidak memiliki kode kesalahan http yang cocok.
Bisakah Anda memberi kami sedikit lebih banyak info tentang apa yang ingin Anda capai dengan kode itu. Mungkin ada cara yang lebih baik untuk mendapatkan informasi yang Anda butuhkan.