System.Net.WebException
からHTTPステータスコードを取得する簡単な方法はありますか?
たぶんこのようなもの...
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-conditional operator (?.
)を使用すると、1行のコードでHTTPステータスコードを取得できます。
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
変数status
には HttpStatusCode
が含まれます。 HTTPステータスコードが送信されないネットワークエラーのようなより一般的な障害がある場合、status
はnullになります。その場合、ex.Status
を検査して WebExceptionStatus
を取得できます。
障害が発生した場合に説明的な文字列だけを記録する場合は、 null-coalescing operator (??
)を使用して関連するエラーを取得できます。
string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
?? ex.Status.ToString();
404 HTTPステータスコードの結果として例外がスローされた場合、文字列には「NotFound」が含まれます。一方、サーバーがオフラインの場合、文字列には「ConnectFailure」などが含まれます。
(そして、HTTPサブステータスコードを取得する方法を知りたい人のために。それは不可能です。これは、Microsoft IISコンセプトであり、サーバーにのみログオンし、クライアントには送信されません。)
これは、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;
}
あるかどうかはわかりませんが、そのようなプロパティがあった場合、信頼できるとは見なされません。 WebException
は、単純なネットワークエラーを含むHTTPエラーコード以外の理由で起動できます。これらには、一致するhttpエラーコードはありません。
そのコードで何を達成しようとしているのか、もう少し詳しく教えてください。必要な情報を取得するより良い方法があるかもしれません。