DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

HTTPの応答時のステータスコードを取得する

WebRequest、WebResponseクラスを使ってファイルをダウンロードし表示する」で紹介したように、HttpWebRequest、HttpWebResponseクラスを使って応答を受信した時、そのステータスコード("200 OK"や"404 Not Found"など)はStatusCodeプロパティで、またその説明はStatusDescriptionプロパティで分かります。

"404 Not Found"などのプロトコルレベルのエラーの場合、HttpWebRequestのGetResponseメソッドでWebException例外がスローされます。この場合ステータスコードを知るには、WebExceptionを捕捉し、そのStatusプロパティがWebExceptionStatus.ProtocolErrorであるか調べ、そうであればResponseプロパティからHttpWebResponseを取得し、StatusCodeプロパティを調べます。

StatusCodeプロパティで返されるHttpStatusCode列挙体のメンバとHTTPステータスコードの対応は次のようになっています。(それぞれのステータスコードの説明に関しては、RFC2616をご覧ください。)

ステータスコード HttpStatusCode列挙体のメンバ名
100 Continue Continue
101 Switching Protocols SwitchingProtocols
200 OK OK
201 Created Created
202 Accepted Accepted
203 Non-Authoritative Information NonAuthoritativeInformation
204 No Content NoContent
205 Reset Content ResetContent
206 Partial Content PartialContent
300 Multiple Choices Ambiguous または MultipleChoices
301 Moved Permanently Moved または MovedPermanently
302 Found Found または Redirect
303 See Other RedirectMethod または SeeOther
304 Not Modified NotModified
305 Use Proxy UseProxy
306 (Unused) Unused
307 Temporary Redirect TemporaryRedirect または RedirectKeepVerb
400 Bad Request BadRequest
401 Unauthorized Unauthorized
402 Payment Required PaymentRequired
403 Forbidden Forbidden
404 Not Found NotFound
405 Method Not Allowed MethodNotAllowed
406 Not Acceptable NotAcceptable
407 Proxy Authentication Required ProxyAuthenticationRequired
408 Request Timeout RequestTimeout
409 Conflict Conflict
410 Gone Gone
411 Length Required LengthRequired
412 Precondition Failed PreconditionFailed
413 Request Entity Too Large RequestEntityTooLarge
414 Request-URI Too Long RequestUriTooLong
415 Unsupported Media Type UnsupportedMediaType
416 Requested Range Not Satisfiable RequestedRangeNotSatisfiable
417 Expectation Failed ExpectationFailed
500 Internal Server Error InternalServerError
501 Not Implemented NotImplemented
502 Bad Gateway BadGateway
503 Service Unavailable ServiceUnavailable
504 Gateway Timeout GatewayTimeout
505 HTTP Version Not Supported HttpVersionNotSupported

次のコードは、"http://www.yahoo.co.jp/hoge.html"というURLを要求した時、サーバーから返されるステータスコードを表示するものです。

VB.NET
コードを隠すコードを選択
'要求するURL
Dim url As String = "http://www.yahoo.co.jp/hoge.html"

'WebRequestの作成
Dim webreq As System.Net.HttpWebRequest = _
    CType(System.Net.WebRequest.Create(url), _
    System.Net.HttpWebRequest)

Dim webres As System.Net.HttpWebResponse = Nothing
Try
    'サーバーからの応答を受信するためのWebResponseを取得
    webres = CType(webreq.GetResponse(), System.Net.HttpWebResponse)

    '応答したURIを表示する
    Console.WriteLine(webres.ResponseUri)
    '応答ステータスコードを表示する
    Console.WriteLine("{0}:{1}", _
        webres.StatusCode, webres.StatusDescription)
Catch ex As System.Net.WebException
    'HTTPプロトコルエラーかどうか調べる
    If ex.Status = System.Net.WebExceptionStatus.ProtocolError Then
        'HttpWebResponseを取得
        Dim errres As System.Net.HttpWebResponse = _
            CType(ex.Response, System.Net.HttpWebResponse)
        '応答したURIを表示する
        Console.WriteLine(errres.ResponseUri)
        '応答ステータスコードを表示する
        Console.WriteLine("{0}:{1}", _
            errres.StatusCode, errres.StatusDescription)
    Else
        Console.WriteLine(ex.Message)
    End If
Finally
    '閉じる
    If Not (webres Is Nothing) Then
        webres.Close()
    End If
End Try
C#
コードを隠すコードを選択
//要求するURL
string url = "http://www.yahoo.co.jp/hoge.html";

//WebRequestの作成
System.Net.HttpWebRequest webreq =
    (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);

System.Net.HttpWebResponse webres = null;
try
{
    //サーバーからの応答を受信するためのWebResponseを取得
    webres = (System.Net.HttpWebResponse) webreq.GetResponse();

    //応答したURIを表示する
    Console.WriteLine(webres.ResponseUri);
    //応答ステータスコードを表示する
    Console.WriteLine("{0}:{1}",
        webres.StatusCode, webres.StatusDescription);
}
catch (System.Net.WebException ex)
{
    //HTTPプロトコルエラーかどうか調べる
    if (ex.Status == System.Net.WebExceptionStatus.ProtocolError)
    {
        //HttpWebResponseを取得
        System.Net.HttpWebResponse errres =
            (System.Net.HttpWebResponse) ex.Response;
        //応答したURIを表示する
        Console.WriteLine(errres.ResponseUri);
        //応答ステータスコードを表示する
        Console.WriteLine("{0}:{1}",
            errres.StatusCode, errres.StatusDescription);
    }
    else
        Console.WriteLine(ex.Message);
}
finally
{
    //閉じる
    if (webres != null)
        webres.Close();
}

WebClientクラスを使用している場合も上記と同じようにWebExceptionを捕捉してステータスコードを調べることができます。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。