164

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

4

6 に答える 6

265

多分このようなもの...

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
    }
}
于 2010-09-01T00:04:18.120 に答える
28

null条件演算子( )を使用する?.と、1行のコードでHTTPステータスコードを取得できます。

 HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

変数には。statusが含まれますHttpStatusCode。HTTPステータスコードが送信されないネットワークエラーなど、より一般的な障害が発生した場合は、statusnullになります。その場合、ex.Statusを取得するために検査することができますWebExceptionStatus

失敗した場合に説明文字列をログに記録するだけの場合は、null合体演算子??)を使用して関連するエラーを取得できます。

string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
    ?? ex.Status.ToString();

404 HTTPステータスコードの結果として例外がスローされた場合、文字列には「NotFound」が含まれます。一方、サーバーがオフラインの場合、文字列には「ConnectFailure」などが含まれます。

(そして、HTTPサブステータスコードを取得する方法を知りたい人のために。それは不可能です。これは、サーバーにのみログオンし、クライアントに送信されないMicrosoft IISの概念です。)

于 2017-01-17T13:31:54.697 に答える
11

(私は質問が古いことを知っていますが、それはグーグルのトップヒットの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句に例外を再スローする必要がないことに注意してください。

于 2017-10-18T12:55:58.790 に答える
10

これは、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;
}
于 2014-01-16T10:26:14.123 に答える
5

このコードを試して、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;
}
于 2014-12-09T10:05:35.127 に答える
1

あるかどうかはわかりませんが、そのような物件があったとしたら、信頼できるとは言えません。AWebExceptionは、単純なネットワークエラーなどのHTTPエラーコード以外の理由で発生する可能性があります。それらには、そのような一致するhttpエラーコードはありません。

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

于 2010-08-31T23:56:05.693 に答える