回答:
多分このようなもの...
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
}
}
null条件演算子(?.
)を使用すると、1行のコードでHTTPステータスコードを取得できます。
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
変数にstatus
はが含まれますHttpStatusCode
。HTTPエラーコードが送信されないネットワークエラーのような、より一般的なエラーが発生した場合status
は、nullになります。その場合は、検査してex.Status
を取得できますWebExceptionStatus
。
失敗した場合に説明の文字列をログに記録するだけの場合は、null結合演算子(??
)を使用して関連するエラーを取得できます。
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
404 HTTPステータスコードの結果として例外がスローされた場合、文字列には「NotFound」が含まれます。一方、サーバーがオフラインの場合、文字列には「ConnectFailure」などが含まれます。
(そして、HTTPサブステータスコードを取得する方法を知りたい人にとっては、不可能です。これは、サーバーにのみログオンし、クライアントに送信されないというMicrosoft IISの概念です。)
?.
プレビューのリリース時に、演算子の名前がnull伝播演算子またはnull条件演算子のどちらであったかは不明です。しかし、Atlassianリシャーパーは、そのようなシナリオでnull伝播演算子を使用するよう警告します。null条件演算子とも呼ばれます。
これは、WebResponseが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;
}
(私は質問が古いことを理解していますが、それはGoogleのトップヒットの1つです。)
応答コードを知りたい一般的な状況は、例外処理です。C#7以降では、パターンマッチングを使用して、例外が述語と一致する場合にのみ実際にcatch句を入力できます。
catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
doSomething(response.StatusCode)
}
これは、これが別のレベルのWebException
実際の内部例外であった(そして私たちはにのみ関心がある404
)この場合など、さらに別のレベルに簡単に拡張できます。
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
最後に、上記の解決策ではそもそも句を入力していないため、条件に一致しない場合、catch句で例外を再スローする必要がないことに注意してください。
このコードを試して、WebExceptionからHTTPステータスコードを取得できます。SLにはWebExceptionStatus.ProtocolErrorが定義されていないため、Silverlightでも機能します。
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return null;
}
return 0
?以上HttpStatusCode?
(nullable)?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}