.NET TIPS

HTTPステータス・コードを取得しWebページの存在を確認するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2008/12/11

 任意のURLにより指定されたWebページが存在するかどうか(実際にアクセスできるかどうか)は、Webサーバにアクセスし、その応答時に返されるHTTPステータス・コードを調べることによりチェック可能だ。

 HTTPステータス・コードとは、HTTP通信時におけるWebサーバからの応答の状態を表すためのもので、RFC 2616(Hypertext Transfer Protocol -- HTTP/1.1)で定義されており、.NETのクラス・ライブラリではコードの一覧がSystem.Net名前空間のHttpStatusCode列挙体で定義されている。

 RFC 2616に掲載されているHTTPステータス・コードと、HttpStatusCode列挙体の値の一覧を次の表に示す。

コード値 RFC 2616で定義された意味 HttpStatuCode列挙体の値
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 MultipleChoices
300 Ambiguous
301 Moved Permanently Moved
301 MovedPermanently
302 Found Found
302 Found Redirect
303 See Other RedirectMethod
303 SeeOther
304 Not Modified NotModified
305 Use Proxy UseProxy
306 Unused
307 Temporary Redirect RedirectKeepVerb
307 TemporaryRedirect
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 Time-out 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 Large 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 Time-out GatewayTimeout
505 HTTP Version not supported HttpVersionNotSupported
HTTPステータス・コードとHttpStatusCode列挙体の値の一覧
HttpStatusCode列挙体では、1つのHTTPステータス・コードに対して複数の値が割り当てられている場合がある。

 HTTPステータス・コードを取得するには、まずWebページにアクセスする。これに関しては、リクエストを示すHttpWebRequestクラスと、レスポンス(応答)を示すHttpWebResponseクラス(ともにSystem.Net名前空間)を使用する。これらのクラスの利用方法については「TIPS:WebRequest/WebResponseクラスでWebページを取得するには?」を参照してほしい。

 Webサーバから応答があった場合には、WebサーバからのレスポンスであるHttpWebResponseオブジェクトのStatusCodeプロパティにHttpStatusCode列挙体の値がセットされる。

 ただし、例えばページが存在しない場合には、HttpWebResponseオブジェクトの取得時に例外が発生する。それでもWebサーバが応答している場合には、例外オブジェクトであるWebExceptionオブジェクト(System.Net名前空間)のResponseプロパティからHttpWebResponseオブジェクトが取得できるため、この場合にもHTTPステータス・コードを得ることができる。

 ここで注意しなければならないのは、Webサーバが応答しない場合(例えばサーバのアドレスが間違っている、ネットワークが利用できない、などの場合)にも同様に例外が発生するという点だ。この場合にはレスポンスを得られないため、HTTPステータス・コードも取得不可能だ。

 以上の手順を実装すると、次のリストのGetStatusCodeメソッドのようになる。なお、このメソッドでは、レスポンスを得られない場合は例外をそのまま再スローしている。

// pagecheck.cs

using System;
using System.Net;

class PageCheck {

  // urlにアクセスしてステータス・コードを返す
  static public HttpStatusCode GetStatusCode(string url) {

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
    HttpWebResponse res = null;
    HttpStatusCode statusCode;

    try {
      res = (HttpWebResponse)req.GetResponse();
      statusCode = res.StatusCode;

    } catch (WebException ex) {

      res = (HttpWebResponse)ex.Response;

      if (res != null) {
        statusCode = res.StatusCode;
      } else {
        throw; // サーバ接続不可などの場合は再スロー
      }
    } finally {
      if (res != null) {
        res.Close();
      }
    }
    return statusCode;
  }

  // ページが存在するかチェックするサンプル
  static void Main(string[] args) {

    string url = "http://www.atmarkit.co.jp/nosuchpage.html";
    WebRequest.DefaultWebProxy = null; // プロキシ未使用を明示

    HttpStatusCode statusCode = GetStatusCode(url);

    int code = (int)statusCode; // 列挙体の値を数値に変換

    if (code >= 400) { // 4xx、5xxはアクセス失敗とする
      Console.WriteLine("ページは存在しないようです:" + code);
    } else {
      Console.WriteLine("ページは存在します:" + code);
    }
    // 出力:ページは存在しないようです:404
  }
}

// コンパイル方法:csc pagecheck.cs
指定されたURLのページが存在するかチェックするC#のサンプル・プログラム(pagecheck.cs)

' pagecheck.vb

Imports System
Imports System.Net

Class PageCheck

  ' urlにアクセスしてステータス・コードを返す
  Public Shared Function GetStatusCode(ByVal url As String) As HttpStatusCode

    Dim req As HttpWebRequest = _
                CType(WebRequest.Create(url), HttpWebRequest)
    Dim res As HttpWebResponse = Nothing
    Dim statusCode As HttpStatusCode

    Try
      res = CType(req.GetResponse(), HttpWebResponse)
      statusCode = res.StatusCode
    Catch ex As WebException
      res = CType(ex.Response, HttpWebResponse)
      If Not res Is Nothing Then
        statusCode = res.StatusCode
      Else
        Throw ' サーバ接続不可などの場合は再スロー
      End If
    Finally
      If Not res Is Nothing Then
        res.Close()
      End If
    End Try
    Return statusCode
  End Function

  ' ページが存在するかチェックするサンプル
  Shared Sub Main()

    Dim url As String = "http://www.atmarkit.co.jp/nosuchpage.html"

    WebRequest.DefaultWebProxy = Nothing ' プロキシ未使用を明示

    Dim statusCode As HttpStatusCode = GetStatusCode(url)

    ' 列挙体の値を数値に変換
    Dim code As Integer = CType(statusCode, Integer)

    If code >= 400 Then  ' 4xx、5xxはアクセス失敗とする
      Console.WriteLine("ページは存在しないようです:" & code)
    Else
      Console.WriteLine("ページは存在します:" & code)
    End If
    ' 出力:ページは存在しないようです:404
  End Sub
End Class

' コンパイル方法:vbc pagecheck.vb
指定されたURLのページが存在するかチェックするVBのサンプル・プログラム(pagecheck.vb)

 Mainメソッドでは、上述のGetStatusCodeメソッドを呼び出し、その戻り値であるHttpStatusCode列挙体の値を整数に変換して、それが400以上(=HTTPステータス・コードが400番以降)である場合にはページは存在していないと判断している(なお、例外処理は省略した)。End of Article

利用可能バージョン:.NET Framework 2.0以降
カテゴリ:クラス・ライブラリ 処理対象:ネットワーク
使用ライブラリ:HttpWebRequestクラス(System.Net名前空間)
使用ライブラリ:HttpWebResponseクラス(System.Net名前空間)
使用ライブラリ:HttpStatusCodeクラス(System.Net名前空間)
使用ライブラリ:WebExceptionクラス(System.Net名前空間)
関連TIPS:WebRequest/WebResponseクラスでWebページを取得するには?

この記事と関連性の高い別の.NET TIPS
WebRequest/WebResponseクラスでWebページを取得するには?
Webサーバのプロトコル違反による例外を回避するには?
ファイルのダウンロードをレジューム(再開)するには?
WebClientクラスでWebページを取得するには?
HTTP圧縮を使用してWebページを取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間