web-dev-qa-db-ja.com

System.Net.WebException HTTPステータスコード

System.Net.WebExceptionからHTTPステータスコードを取得する簡単な方法はありますか?

140
Gilsham

たぶんこのようなもの...

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
    }
}
228
LukeH

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コンセプトであり、サーバーにのみログオンし、クライアントには送信されません。)

23

これは、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;
}
8
pr0gg3r

(質問は古いことは承知していますが、これは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句で例外を再スローする必要がないことに注意してください。

6
miniyou

このコードを試して、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;
}
3
Sergey

あるかどうかはわかりませんが、そのようなプロパティがあった場合、信頼できるとは見なされません。 WebExceptionは、単純なネットワークエラーを含むHTTPエラーコード以外の理由で起動できます。これらには、一致するhttpエラーコードはありません。

そのコードで何を達成しようとしているのか、もう少し詳しく教えてください。必要な情報を取得するより良い方法があるかもしれません。

1
JaredPar