連載

ASP→ASP.NET移行テクニック

第2回 移行インパクトのツボを探る

山田 祥寛
2004/05/22
Page1 Page2 Page3 Page4

●Request.Form、QueryString、ServerVariablesコレクション

 Request.Form、QueryString、ServerVariablesの3つはリクエスト・パラメータを取得する重要なコレクションで、レガシーASPにおいてはResponse.Writeメソッドと並んで頻出したメンバの1つでもあった。ASP.NETでは、これらコレクションはRequestオブジェクト(HttpRequestクラス)のプロパティという形で提供され、内部的にはNamedValueCollectionオブジェクト(名前と値のセットからなるコレクション)を返すが、単一の値を取得する限りにおいては、特に仕様の違いを意識する必要はない。つまり、

Response.Write(Request.QueryString("name"))

 または

Response.Write(Request.QueryString.Item("name"))

というコードは、レガシーASPでもASP.NETでも有効だ。

 しかし、1つのキーに対して、複数の値が結び付いている場合を想定すると、少々話が違ってくる。例えば、チェック・ボックスやリスト・ボックスなどからの入力においては、同一のキー名で複数の値がセットされるというのはよくある話だ。

 そのような場合、レガシーASPでは以下のようなコードで複数の値を取得することができた。

For i=1 To Request.QueryString("name").Count
  Response.Write(Request.QueryString("name")(i) & "<br />")
Next

 しかし、ASP.NETでは、これは不可である。レガシーASPにおいては、Request.QueryString("name")(Request.Form、ServerVariablesでも同様)はnameパラメータに関連付いた複数の値の配列であったが、ASP.NETにおいてはnameパラメータに関連付いた文字列であるにすぎない。

 1つのパラメータに複数の値が結び付いている場合にも、カンマ区切りの文字列として返すのみなのである。もしもASP.NETにおいて、1つのパラメータに関連付く2つ以上の値を取得したい場合には、以下のようにGetValuesプロパティを介さなければならない。

For i As Integer=0 To Request.QueryString.GetValues("name").Length-1
  Response.Write(Request.QueryString.GetValues("name")(i) & "<br />")
Next

 GetValuesメソッドは1つのキーに関連付いた複数の値を文字列の配列として返す。この際、配列のインデックス番号は0始まりである点にも注意してほしい。

●Request.Cookiesコレクション

 1つのパラメータに関連付く複数の値を取得するときの事情は、Request.Cookiesコレクションでも同様だ。

 ASP.NETでは、CookiesコレクションはRequestオブジェクト(HttpRequestクラス)のプロパティという形で提供され、内部的にはHttpCookieCollectionオブジェクト(クッキーのコレクション)を返すが、単一の値を取得する限りにおいては、特に仕様の違いを意識する必要はない。つまり、

Response.Write(Request.Cookies("name"))

 または

Response.Write(Request.Cookies.Item("name"))

というコードは、レガシーASPでもASP.NETでも有効だ。

 しかし、クッキーにはサブ・キーという概念があり、1つのクッキー名の配下に複数のサブ・キーを配置することができる。サブ・キーは複数のキーを意味のある単位で管理したいという場合に大変便利な機能でもあり、読者諸兄の中にも利用しているという方は多いはずだ。

 このサブ・キーにアクセスしたいという場合、レガシーASPでは以下のようなコードで実現することができた。

For i=1 To Request.Cookies("name").Count
  Response.Write(Request.Cookies("name")(i) & "<br />")
Next

 しかし、ASP.NETでは、これは不可である。レガシーASPにおいては、Request.Cookies("name")はnameキーに関連付いた複数の値の配列であったが、ASP.NETにおいては文字列である。1つのパラメータに複数の値が結び付いている場合にも、カンマ区切りの文字列として返すのみなのである。

 もしもASP.NETにおいて、1つのパラメータに関連付く2つ以上の値を取得したい場合には、以下のようにValuesプロパティを介さなければならない。

For i As Integer=0 To Request.Cookies("name").Values.Count-1
  Response.Write(Request.Cookies("name").Values(i) & "<br />")
Next

 HttpCookieコレクションにはGetValuesメソッドはないので注意すること。

●ASPErrorオブジェクト

 ASP.NETでは、もはやASPErrorオブジェクトはサポートされない。従って、レガシーASPでは有効であった以下のコードは、ASP.NETでは使用できない。

Set objErr=Server.GetLastError
Response.Write(objErr.Description)

 ASP.NETの世界では、エラー・ハンドリングはすべて例外処理に委ねられ、例外情報はExceptionクラス(System名前空間)、またはその派生クラスによって管理される。従って、上記のコードもASP.NETにおいては、以下のように記述しなければならない。

Dim objErr As Exception=Server.GetLastError
Response.Write(objErr.Message)

○推奨されないメソッド/プロパティ

 また、ASP.NETで引き続きサポートこそされるものの、非推奨の扱いとなったメソッドやプロパティもいくつかある。これを移行のタイミングでどこまで修正するかは判断が分かれるところであるかもしれないが、少なくとも新規にコードを作成する場合には、新たに用意された代替のメソッドやプロパティを利用するようにしてほしい。

 以下に非推奨メソッドの一覧を挙げておく。

オブジェクト 非推奨メソッド 代替メソッド
Request ServerVariables Requestオブジェクトの各プロパティ
Params Cookies、Form、QueryString、ServerVariables
Response Buffer BufferOutput
CacheControl Cache
Expires Cache
ExpiresAbsolute Cache
Status StatusCode、StatusDescription
AddHeader AppendHeader
ASP.NETにおける非推奨メソッドの一覧

 Request.ServerVariablesプロパティについては、全面的に非推奨というわけではない。しかし、Requestオブジェクトに新たに追加されたContentLengthやUserLanguagesのような専用のプロパティが存在する場合には、できる限りこちらを利用するべきだ。専用のプロパティを利用することで、いちいちコレクションの内部を走査する必要がなくなるので、パフォーマンス的に有利であるだけでなく、適切な型で戻り値が返されるので、不要な型変換を記述しなくても済む。もちろん、これらのプロパティが対応していない環境変数にアクセスしたい場合には、従来どおり、Request.ServerVariablesプロパティを利用すればよい。

 Request.Paramsプロパティは、Requestオブジェクトに含まれるForm、QueryString、ServerVariables、Cookiesの4コレクションをマージしたもので、レガシーASPにおいてはRequestオブジェクト自体がデフォルトで持つコレクションであった。Request.ParamsプロパティはASP.NETになって新たに設けられたプロパティであるが、あくまでレガシーASPからの使い勝手を踏襲するために設けられたプロパティであると考えるべきであり、積極的には使用するべきではない(レガシーASPでもRequestオブジェクトのデフォルト・コレクションへのアクセスは推奨されていなかった)。というのも、リクエストに含まれるすべてのパラメータにアクセスする必要があることからパフォーマンス的に不利であるし、何よりも、フォーム・パラメータとクエリ情報とでパラメータ名が重複していた場合、意図しない値が取得される恐れもあるためだ。


 INDEX
  ASP→ASP.NET移行テクニック
  第2回 移行インパクトのツボを探る
    1.変更・廃止されたオブジェクト/メソッド
  2.推奨されないメソッド/プロパティ
    3.ディレクティブ構文/Global.asax/構成ファイルの変更点
    4.SSI/Server.Executeメソッドについて
 
インデックス・ページヘ  「ASP→ASP.NET移行テクニック」


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 記事ランキング

本日 月間