からHTTPステータスコードを取得する簡単な方法はありますSystem.Net.WebException
か?
6 に答える
多分このようなもの...
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の概念です。)
(私は質問が古いことを知っていますが、それはグーグルのトップヒットの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句に例外を再スローする必要がないことに注意してください。
これは、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;
}
このコードを試して、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;
}
あるかどうかはわかりませんが、そのような物件があったとしたら、信頼できるとは言えません。AWebException
は、単純なネットワークエラーなどのHTTPエラーコード以外の理由で発生する可能性があります。それらには、そのような一致するhttpエラーコードはありません。
そのコードで何を達成しようとしているのかについて、もう少し詳しく教えてください。必要な情報を取得するためのより良い方法があるかもしれません。