Yanıtlar:
Belki böyle bir şey ...
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
}
}
Kullanarak boş-şartlı operatörü ( ?.
) Eğer tek bir kod satırı ile HTTP durum kodu alabilirsiniz:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
Değişken status
içerecektir HttpStatusCode
. Hiçbir HTTP durum kodunun gönderilmediği bir ağ hatası gibi daha genel bir hata status
olduğunda, null olur. Bu durumda ex.Status
almak için inceleyebilirsiniz WebExceptionStatus
.
Arıza durumunda yalnızca açıklayıcı bir dizenin günlüğe kaydedilmesini istiyorsanız , ilgili hatayı almak için null birleştirme operatörünü ( ??
) kullanabilirsiniz:
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
404 HTTP durum kodunun bir sonucu olarak istisna atılırsa, dize "NotFound" içerecektir. Öte yandan, sunucu çevrimdışıysa dizede "ConnectFailure" vb. Bulunacaktır.
(Ve HTTP alt durum kodunun nasıl alınacağını bilmek isteyen herkes için. Bu mümkün değil. Sadece sunucuda oturum açmış ve istemciye hiç gönderilmemiş bir Microsoft IIS konseptidir.)
?.
Önizleme sürümü sırasında operatörün başlangıçta boş yayılma operatörü veya boş koşullu operatör olarak adlandırıldığından emin değilim . Ancak Atlassian yeniden birleştirici, bu tür senaryolarda boş yayılma operatörü kullanmak için bir uyarı verir. Boş koşullu operatör olarak da adlandırıldığını bilmek güzel.
bu yalnızca WebResponse bir HttpWebResponse ise çalışır.
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;
}
(Sorunun eski olduğunu, ancak Google'daki en popüler isabetler arasında olduğunu fark ediyorum.)
Yanıt kodunu bilmek istediğiniz yaygın bir durum istisna işlemedir. C # 7'den itibaren, yalnızca istisna yükleminizle eşleşiyorsa yakalama yan tümcesini girmek için desen eşleştirmeyi kullanabilirsiniz:
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
Bu WebException
, aslında bir başkasının iç istisnasının olduğu bu durumda (ve yalnızca ilgilendiğimiz gibi 404
) daha ileri seviyelere kolayca genişletilebilir :
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Son olarak: kriterlere uymadığında istisnayı yakalama maddesine nasıl atmaya gerek olmadığına dikkat edin, çünkü yukarıdaki çözüme ilk etapta madde girmiyoruz.
WebException'dan HTTP durum kodu almak için bu kodu deneyebilirsiniz. Silverlight'ta da çalışır, çünkü SL'de WebExceptionStatus.ProtocolError tanımlanmamıştır.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
? ya da daha iyisi HttpStatusCode?
( boş )
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
Orada olup olmadığından emin değilim ama böyle bir özellik olsaydı güvenilir sayılmazdı. A WebException
, basit ağ hataları dahil HTTP hata kodları dışındaki nedenlerle tetiklenebilir. Bunların eşleşen http hata kodu yok.
Bize bu kodla neyi başarmaya çalıştığınız hakkında biraz daha bilgi verebilir misiniz? İhtiyacınız olan bilgiyi almanın daha iyi bir yolu olabilir.