HttpRequestクラス(System.Web名前空間)は、クライアントから要求されたURL(リクエストURL)を取得するための、さまざまなプロパティを提供している(下表を参照)。リクエストURLはアクセス・ログを記録するようなケース、あるいは、ページへのアクセス制御を監視するようなケースなど、意外と多くの用途で利用できる情報だ。
| プロパティ | 概要 | 
|---|---|
| ApplicationPath | 要求ページが属するアプリケーションの仮想パス | 
| CurrentExecutionFilePath | 要求ページの仮想パスを取得(追加パス情報を含まない) | 
| FilePath | 要求ページの仮想パスを取得(追加パス情報を含まない) | 
| Path | 要求ページの仮想パスを取得(追加パス情報を含む) | 
| PathInfo | 追加パス情報を取得 | 
| PhysicalApplicationPath | 要求ページが属するアプリケーションの物理パス | 
| PhysicalPath | 要求ページの物理パス(追加パス情報を含まない) | 
| RawUrl | 要求ページの生のURL | 
| Url | 要求ページのURL(Uriオブジェクト) | 
| リクエストURLを取得するための主要なプロパティ ※「追加パス情報」については後述する。  | |
「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(HTTPモジュール編)」「TIPS:[ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?」などでもリクエストURL情報を利用しているので、具体的な用途については、こちらも併せて参照してみてほしい。
次のサンプル・コードでは、上に挙げた各プロパティを利用して、リクエストURLを取得している。
<%@ Page ContentType="text/html" Language="C#" %>
<script runat="Server">
Hashtable objTbl = null;
void Page_Load(Object sender, EventArgs e){
  // Hashtableクラスに各プロパティ名と値をセットし、
  // DataGridコントロールにバインド
  objTbl = new Hashtable();
  objTbl.Add("ApplicationPath", Request.ApplicationPath);
  objTbl.Add("CurrentExecutionFilePath", Request.CurrentExecutionFilePath);
  objTbl.Add("FilePath", Request.FilePath);
  objTbl.Add("Path", Request.Path);
  objTbl.Add("PathInfo", Request.PathInfo);
  objTbl.Add("PhysicalApplicationPath", Request.PhysicalApplicationPath);
  objTbl.Add("PhysicalPath", Request.PhysicalPath);
  objTbl.Add("RawUrl", Request.RawUrl);
  objTbl.Add("Url", Request.Url);
  DataBind();
}
</script>
<html>
<head>
<title>リクエストURL</title>
<body>
<h1>リクエストURL</h1>
<hr />
<form runat="Server">
  <asp:DataGrid id="objGrd" runat="Server" ShowHeader="False"
    DataSource="<%# objTbl %>" AutoGenerateColumns="False" CellPadding="2">
    <ItemStyle   BackColor="#FFEEEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />
    <Columns>
      <asp:BoundColumn DataField="Key" />
      <asp:BoundColumn DataField="Value" />
    </Columns>
  </asp:DataGrid>
</form>
</body>
</html
<%@ Page ContentType="text/html" Language="VB" %>
<script runat="Server">
Dim objTbl As Hashtable
Sub Page_Load(sender As Object, e As EventArgs)
  ' Hashtableクラスに各プロパティ名と値をセットし、
  ' DataGridコントロールにバインド
  objTbl=New Hashtable()
  objTbl.Add("ApplicationPath",Request.ApplicationPath)
  objTbl.Add("CurrentExecutionFilePath",Request.CurrentExecutionFilePath)
  objTbl.Add("FilePath",Request.FilePath)
  objTbl.Add("Path",Request.Path)
  objTbl.Add("PathInfo",Request.PathInfo)
  objTbl.Add("PhysicalApplicationPath",Request.PhysicalApplicationPath)
  objTbl.Add("PhysicalPath",Request.PhysicalPath)
  objTbl.Add("RawUrl",Request.RawUrl)
  objTbl.Add("Url",Request.Url)
  DataBind()
End Sub
</script>
<html>
<head>
<title>リクエストURL</title>
<body>
<h1>リクエストURL</h1>
<hr />
<form runat="Server">
  <asp:DataGrid id="objGrd" runat="Server" ShowHeader="False"
    DataSource="<%# objTbl %>" AutoGenerateColumns="False" CellPadding="2">
    <ItemStyle   BackColor="#FFEEEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />
    <Columns>
      <asp:BoundColumn DataField="Key" />
      <asp:BoundColumn DataField="Value" />
    </Columns>
  </asp:DataGrid>
</form>
</body>
</html>
上記のサンプル・コードを実行したのが、次の画面である。
サンプル・プログラムの実行結果
http://localhost/netIns/requestUrl_vb.aspx/sample?key=123というURLでアクセスした場合のサンプル・プログラムの実行結果。
各プロパティを区別するポイントとして、以下の4点が挙げられる。
- パスの種類(アプリケーションパス/ファイルパス/追加パス)
 - 物理パスか、仮想パスか
 - クエリ情報(?キー名=値)を含むか
 - 追加パス情報を含むか
 
追加パス情報とは、リソースの位置を表すパスそのものとは少々種類の異なる――むしろ「付随的な入力パラメータ」ともいうべき情報だ。本稿の例の場合は「/sample」の部分のことをいう。プログラム・コードから利用できるパラメータという意味ではクエリ情報にも似ているが、クエリ情報が「?キー名=値」のような、実際のパスとは異なるフォーマットで記述しなければならないのに対し、追加パス情報は、その名のとおり、あたかもパスの一部であるかのように、パラメータ情報を記述できるという違いがある。
以上の観点で、いま一度、おのおののプロパティを分類してみよう。
| プロパティ | 種類 | 物理/仮想 | クエリ情報 | 追加パス | 
|---|---|---|---|---|
| ApplicationPath | アプリケーションパス | 仮想 | × | × | 
| PhysicalApplicationPath | アプリケーションパス | 物理 | × | ○ | 
| CurrentExecutionFilePath | ファイルパス | 仮想 | × | × | 
| FilePath | ファイルパス | 仮想 | × | × | 
| Path | ファイルパス | 仮想 | × | ○ | 
| PhysicalPath | ファイルパス | 物理 | ○ | ○ | 
| RawUrl | ファイルパス | 仮想 | ○ | ○ | 
| Url | ファイルパス | 仮想(フルURL) | ○ | ○ | 
| PathInfo | 追加パス | 仮想 | × | ○ | 
| リクエストURLを取得するための主要なプロパティの分類比較表 表中の○は、列項目の情報(クエリ情報もしくは追加パス情報)を「含む」ことを意味し、×は「含まない」ことを意味する。  | ||||
サンプル・コードの実行結果と併せてみると、それぞれのプロパティの役割の違いがだんだん見えてくるのではないだろうか。ただ、比較表からだけでは分からないのが、CurrentExecutionFilePathプロパティとFilePathプロパティの違いだ。この2つのプロパティの違いが出てくるのは、Server.Executeメソッド、Transferメソッドを利用した場合だ。これらのメソッドを利用した場合にも、FilePathプロパティは常に「最初に要求された」URLを返すが、CurrentExecutionFilePathプロパティは「転送/インクルード先ページ」のURLを返す。
カテゴリ:Webフォーム 処理対象:URL
使用ライブラリ:HttpRequestクラス(System.Web名前空間)
関連TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(HTTPモジュール編)
関連TIPS:[ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?
Copyright© Digital Advantage Corp. All Rights Reserved.
