Request オブジェクト  

Request オブジェクトを使用すると、ユーザーの HTTP 要求のヘッダと本文にアクセスできます。ユーザーが行った決定への応答はこのオブジェクトによって可能になるので、これは理解することが最も重要な組み込み型の ASP オブジェクトです。Request オブジェクトを使用すると、Web ページを動的に作成し、ユーザーからの入力に基づいて、より意味のあるサーバーサイドアクション (データベースの更新など) を実行できます。

HTTP の動作  
 
 

Request オブジェクトの詳細については、後で説明します。まず最初に、HTTP プロトコルの基本について理解することが重要です。この基本を理解すれば、Request オブジェクトの使用が不可解なものから現実のものに変わります。心配は無用です。ここでの説明は、HTTP プロトコルの簡単な概要だけです。

HTTP :簡単な例

HTTP が "トランザクション" 型のプロトコルであることは既にご存知でしょう。ブラウザ (クライアント) はサーバーに要求を送ります。サーバーは、可能な場合はその要求に応じ、クライアントに応答を送信します。サーバーは、そのトランザクションについては何も記憶しません。ブラウザはそのトランザクションを記憶することも、記憶しないこともあります。

CGI アプリケーションによって作成された HTML ページ HELLOCGI.HTM

Web ブラウザとサーバー間の相互作用を示すため、その簡単な例を検証します。図 7.1 は Netscape Navigator の画面です。ここには、ユーザーに名前の入力を要求する、非常に単純なフォーム HELLO.HTM が表示されています。ユーザーが [Submit] ボタンをクリックすると、WebSite サーバー上で CGI アプリケーションが起動し、このアプリケーションが図 7.2 に示すページを送信します。この例では Navigator と WebSite を使用していますが、どのブラウザとサーバーでも相互作用はほとんど同じです。また、この例では CGI アプリケーションを使用していますが、HTTP の要求と応答のサイクルは、ASP アプリケーションに関してはほとんど同じです。CGI から ASP への変換の詳細については、付録 B を参照してください。以下では、ブラウザとサーバー間の相互作用がプロトコルによってどのように行われるかについて説明します。

ユーザーが HELLO.HTM の URL の入力を終了すると、Navigator は次のストリームをサーバーに送信します。

次の出力リストでの send は、接続されたソケットでストリームを送信するソケット関数です。この出力で 73 はソケットを示し、179 は関数が返した値、つまり送信される総バイト数を示します。

[73:send:(179)]GET /hello.htm HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/3.0 (Win95; I)
Host: pc229.west.ora.com
Accept: image/gif, image/x-xbitmap, image/jpeg, 
   image/pjpeg, */*

これは 要求ヘッダです。ブラウザは、ドキュメント /HELLO.HTM の取得をサーバーに要求します。Get は、実行する処理をサーバーに示す一般的な記述よりも詳細であり、HTTP 要求タイプを示します。詳細については、本章の 7.1.2 項を参照してください。ブラウザは、ハイパーテキスト転送プロトコルのバージョン 1.0 を使用していることも示します。

この HTTP ヘッダの最初の行の部分は、このデモで使用する TCP/IP パケットスニファであり、実際に送信される HTTP 要求の一部ではありません。この章のすべての HTTP セグメントについても同様です。

スパイプログラムによって作成された次の出力に示すように、サーバーはブラウザが送信したヘッダを受信し、その要求を処理します。

ソケットからのデータの受信には、recv 関数が使用されます。この出力で、最初の番号 21 はサーバーが使用したソケットを表します。"Completed (179)" は関数の戻り値を表し、この場合は 179 バイトを受信して正常に処理を完了したことを示します。これは、ブラウザが送信したバイト数に対応しています。

[21:recv: completed (179)]GET /hello.htm HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/3.0 (Win95; I)
Host: pc229.west.ora.com
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*

サーバーは、ドキュメント HELLO.HTM をブラウザに送信します。

[21:send:(535)]HTTP/1.0 200 OK
Date: Monday, 30-Sep-98 23:33:00 GMT
Server: WebSite/1.1
Allow-ranges: bytes
Accept-ranges: bytes
Connection: Keep-Alive
Content-type: text/html
Last-modified: Monday, 30-Sep-98 23:30:38 GMT
Content-length: 297

<HTML>
<HEAD><TITLE>Hello, World!</TITLE></HEAD>
<BODY>
<FORM ACTION="/cgi-win/hello.exe" METHOD="POST">
What is your name? <INPUT TYPE="text" NAME="name" SIZE=60><BR>
<INPUT TYPE="submit" VALUE="Submit the form">
<INPUT TYPE="reset" VALUE="Clear all fields">
</FORM>
</BODY> </HTML>

ここで、WebSite は合計 535 バイトをブラウザに送信します。この出力は、応答ヘッダ に続いて、空白行、さらに HTML ドキュメントで構成されます。ヘッダフィールドは、バイト数 (Content-length ヘッダ)、送信データのフォーマット (Content-type ヘッダ) などを示します。"200 OK" は、ブラウザの要求が満たされたことを示すステータスコードです。サーバーは、ブラウザと同じように、HTTP バージョン 1.0 を使用していることも示します。

ブラウザは、サーバーが送信したヘッダとデータを読み取ります。

[73:recv: posted]
[73:recv: completed (260)]HTTP/1.0 200 OK
Date: Monday, 30-Sep-98 23:33:00 GMT
Server: WebSite/1.1
Allow-ranges: bytes
Accept-ranges: bytes

Connection: Keep-Alive
Content-type: text/html
Last-modified: Monday, 30-Sep-98 23:30:38 GMT
Content-length: 297

<HTML>
<HEAD><TITLE>H
[73:recv: posted]
[73:recv: completed (275)]ello, World!</TITLE></HEAD>
<BODY>
<FORM ACTION="/cgi-win/hello.exe" METHOD="POST">
What is your name? <INPUT TYPE="text" NAME="name" SIZE=60><BR>
<INPUT TYPE="submit" VALUE="Submit the form">
<INPUT TYPE="reset" VALUE="Clear all fields">
</FORM>
</BODY> </HTML>

recv の 2 つの処理は、ドキュメントと共にヘッダレコードを取得するために必要ですが、これら 2 つの処理で読み取られた総バイト数は、サーバーが送信した総バイト数に等しくなります。

ブラウザは、ユーザー名を入力するフォームを表示し、ユーザーが入力を行って [Submit] ボタンをクリックすると、サーバーに次のデータを送信します。

[70:send:(232)]POST /cgi-win/hello.exe HTTP/1.0
Referer: http://pc229.west.ora.com/hello.htm
Connection: Keep-Alive
User-Agent: Mozilla/3.0 (Win95; I)
Host: pc229.west.ora.com
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
[70:send:(69)]Content-type: application/x-www-form-urlencoded
Content-length: 14
[70:send:(2)]
[70:send:(16)]name=Jayne+Doe

ブラウザはフォームデータを送信するため、HTTP 要求タイプは、最初のヘッダレコードが示すように "POST" になります。同様に、Content-length および Content-type レコードは、ブラウザが要求の本文で 14 バイトの x-www-form-urlencoded データを送信していることを示します。これは、フォームの 1 つのデータフィールドである [name] テキストボックスにユーザーが入力した情報で構成されます。

サーバーは、前の手順でブラウザが送信したヘッダレコードとフォームデータを受信します。これはブラウザが送信するテキストと基本的に同じであるため、ここでは重複して示しません。URL (/cgi-win/hello.exe) は、サーバーに CGI アプリケーション HELLO.EXE を起動させ、フォームのデータをそのアプリケーションに送信させます。CGI アプリケーションは何らかのバックエンド処理を行い、HTML ドキュメントを作成してそれをサーバーに返します。

サーバーは、WSock32 Spy からの次の出力のように、必要なヘッダレコードと共に HTML ドキュメントをブラウザに返します。

[18:send:(422)]HTTP/1.0 200 OK
Date: Monday, 30-Sep-98 23:33:10 GMT
Server: WebSite/1.1
Allow-ranges: bytes
Accept-ranges: bytes
Connection: Keep-Alive
Content-type: text/html
Content-length: 231

<HTML><HEAD>
<TITLE>Welcome to this Web Page!</TITLE></HEAD>

<BODY><H1>Welcome to Our Web Server!</H1><p><p>
Hello, Jayne Doe! We're glad that you took
the time out of your busy day to visit us!
<HR></PRE></BODY></HTML>

サーバーは、231 バイトの HTML ドキュメントを送信することをブラウザに示します。

ブラウザはサーバーが送信したデータストリームを受信し、それを使用して HTML ページを表示します。

以上でブラウザとサーバーの相互作用についてご理解いただけたことでしょう。ただし、説明を簡潔に済ませたいくつかの点や、この簡単な例で説明していない機能については、その詳細について参照することが重要です。

HTTP 要求のタイプ

ブラウザで指定された URL に関してサーバーが行う必要がある処理を示すために、クライアントからサーバーに要求のタイプが渡されます。HTTP 仕様では、PUTDELETE など、数多くの要求のタイプの詳細が示されていますが、すべてのサーバーでサポートされて一般的に使用されるのは、 GET および POST の 2 つだけです。GET 要求は、通常はドキュメントなどの情報を "GET" し、それをクライアントに返すように要求します。要求に追加の情報が含まれている場合、それらの情報は URL のパラメータとして追加されます。一方、POST 要求は、URL に "POST" する情報をサーバーに提供します。通常、これは HTML フォームのコンテンツをサーバーに送信するか、バックエンド処理に必要な情報をサーバーに提供するために使用されます。この情報そのものは、要求の本文に含まれます。

ほとんどのサーバーは、POST メソッドまたは GET メソッドから受信したデータを内部的に処理できません。通常、サーバーにデータを送信する POST 要求や GET 要求は、アクセサリプログラムまたは DLL (CGI、ISAPI アプリケーションおよび ISAPI フィルタ) によって処理されます。POST および GET 要求は、いずれも任意のサイズと種類のデータを返すことができます。

Web サーバーにデータを送信するときに、GETPOST は同じように見えますが、1 つの厳格な規則があります。それは、"GET 要求によって何も変更してはならない" ということです。たとえば、GET 要求に応じてデータベースを変更するような ASP スクリプトは記述しないでください。この理由については、7.1.3 項で詳細に説明します。

フォームの送信

ユーザーがフォームフィールドに情報を入力します。フォームが送信されると、フォームの各フィールドに含まれているデータはサーバーに送信され、サーバーはそのデータを ASP に渡します。このデータは name=value 形式で送信されます。ここで、name<INPUT> タグの NAME= 属性によってフィールドに割り当てられた名前、value はそのフィールドに入力される値を表します。たとえば、名 (first name) を入力するフィールドにユーザーが「Archie」と入力すると、ブラウザは文字列 first_name=Archie を送信します。

METHOD=GET を使用するようにフォームが記述されている場合、フォームデータはパラメータ文字列として URL に追加されます。フォームに多くのフィールドが含まれているか、フィールドに長いテキスト文字列が含まれている場合、絶対 URL は非常に長くなり、扱いにくくなります。さらに、GET で送信される文字数の制限 (通常は 2000) は、POST の場合よりもかなり低くなっています。

フォームで代わりに METHOD=POST を使用する場合、name=value のペアは URL に追加されるのではなく、要求の本文として送信されます。要求ヘッダの URL からではなく、要求の本文からデータを抽出すると、ほとんどのサーバーで POST 要求の処理が大幅に簡単になるだけでなく、パフォーマンスも向上します。

何かを変更したり、元に戻すことができないアクションを発生させるフォーム (ほとんどのフォームがそうですが) では、常に POST メソッドを使用します。POST は、より安全で効率的です。何かを変更するために、決して GET を使用しないでください。ASP スクリプトの作成では、GET メソッドを使用した、プログラムへのデータの引渡しをサポートするかどうかを指定できます。

HTTP 要求と応答

ヘッダは、HTTP で最も誤解のある部分ですが、その役割を理解すれば、ASP の Request オブジェクトおよび Response オブジェクトのプロパティとメソッドの理解が格段に容易になります。

インターネットの任意の電子メールメッセージを見てください。電子メールは、ヘッダと本文という 2 つの部分で構成されています。ヘッダは、メッセージ本文について記述するいくつかの行で構成され、メッセージのルーティング方法が含まれる場合もあります。ヘッダと本文は、空白行で区分されます。ヘッダ構文の詳細については、RFC-822 を参照してください。

HTTP メッセージ (要求または応答) は同じ方法で構造化されます。最初の行は特別な行ですが、最初の空白行までの残りの行は、メールメッセージのようなヘッダです。ヘッダは、要求とそのコンテンツ、または応答とそのコンテンツについて記述しています。

要求

7.1.1 項では、ブラウザからの数多くの要求がありました。ここでは、単純な HTTP 要求の例を示します。

POST /cgi-win/hello.exe HTTP/1.0
Accept: image/gif, image/jpeg, */*
User-Agent: Mozilla/2.0N (Windows; I; 32Bit)
Content-type: application/x-www-form-urlencoded
Content-length: 14
[mandatory blank line]
name=Jayne+Doe

最初の行は、request-line と呼ばれ、要求またはメソッドのタイプを示します。この場合は、POST、URL、およびクライアントが使用している HTTP プロトコルのバージョンを示します。2 行目は、クライアントが受け入れることができるドキュメントのタイプを示します。3 行目は、HTTP では必須ではない "追加の" ヘッダです。このヘッダには、クライアントソフトウェアの名前とバージョンが示されています。この後に続くのは、7.1.1 項で説明しているように、要求の本文に含まれている情報を示す 2 つの行です。

必須の空白行に至るまでのすべては、HTTP 要求ヘッダの一部です。ここでのサンプル行に加えて、このセクションには他の行が含まれることもあります。たとえば、"Cookie" に含まれている情報をブラウザが送信する場合、その情報も要求ヘッダに含まれます。

必須の空白行の下には、HTTP 要求の本文があります。ほとんどの場合、要求のこのセクションは空になります。たとえば、ブラウザが静的ページのみを要求していて、情報を送信しない場合などです。ただし、POST メソッドを使用する場合、Web サーバーに送信される情報は要求のこのセクションに配置されます。

応答

次に、単純な HTTP 応答の例を示します。

HTTP/1.0 200 OK
Date: Thursday, 02-Nov-95 08:44:52 GMT
Server: WebSite/1.1
Last-Modified: Wednesday, 01-Nov-95 02:04:33 GMT
Content-Type: text/html
Content-length: 8151
[mandatory blank line]
<HTML><HEAD>
<TITLE>...

応答の最初の行も特別な行であり、status-line と呼ばれます。この行には、サーバーが使用するプロトコルのバージョンに加えて、ステータスコード と理由フレーズが含まれます。サーバーはステータスコードと理由フレーズを使用して、ブラウザの要求に応答できたかどうかをブラウザに伝えます。この例では、ドキュメントに対するブラウザの要求を正常に満たすことができました。2 番目の行は、サーバーが要求を処理した日時を示します。3 番目の行は、サーバーソフトウェアとバージョンを示すヘッダ行です。4 番目の行は、要求されたドキュメントの最終更新日時を示します。最後の 2 つの行は、要求されたドキュメントのデータのタイプとバイト数を示します。この後に 1 行の空白行と、さらにメッセージの本文が続きます。本文には、ブラウザで表示するためにサーバーが送信するドキュメントデータが含まれます。

HTTP 要求の場合と同じように、必須の空白行より上にある部分すべては、HTTP 応答ヘッダの一部であると見なされます。この行より下にある部分すべては、応答の本文の一部です。

この章では、ASP の Request オブジェクトについて説明します。このオブジェクトは、HTTP 要求のヘッダおよび本文の両方にアクセスするために使用できます。次の章では、Web サーバーから HTTP 応答を操作するために使用できる、ASP の Response オブジェクトについて説明します。

HTTP の Request オブジェクトおよび ASP の Request オブジェクト

既に説明したように、ASP の Request オブジェクトを使用すると、クライアントのブラウザから Web サーバーに送信された HTTP 要求のヘッダと本文の両方にアクセスできます。ASP スクリプトで HTTP 要求から情報を取得する方法は、CGI アプリケーションの方法と基本的に同じです。その例外は、本マニュアルの最初の 2 章で説明しているように、実際の要求メカニズムからではなく、Web サーバーに各タイプのアプリケーションが読み込まれる方法 (CGI か ISAPI フィルタ) から発生します。

CGI アプリケーションの場合と同じように、クライアントブラウザは 2 つの異なる方法で情報を ASP スクリプトに送信できます。最初の方法では、GET メソッドを使用した HTML フォームにより情報を送信できます。

<HTML>
<HEAD><TITLE>Welcome to the Corp.</TITLE></HEAD>
<BODY>
<FORM ACTION=" http://mycorp.com/secure.asp" METHOD="GET">
First name: <INPUT TYPE="text" NAME="first_name" SIZE=60><BR>
Last name: <INPUT TYPE="text" NAME="last_name" SIZE=60><BR>
<INPUT TYPE="submit" VALUE="Submit the form">
<INPUT TYPE="reset" VALUE="Clear all fields">
</FORM>
</BODY> </HTML>

クライアントが GET 要求を送信すると、要求に関する情報は要求 URL の最後に "名前/値" のペアとして追加されます。このペアはアンパサンドで区切られ、先頭に疑問符が付けられます。それぞれの名前はフォームの要素に対応します。たとえば、直前の例でユーザーが 2 つのフィールドに「Horatia」および「Thompson」と入力し、[Submit] ボタンをクリックしたとします。前述のフォーム送信は、サーバーに関する限り、次のコードと同じになります。

http://mycorp.com/secure.asp?first_name=horatia&last_name=thompson

これは重要なポイントです。この例に続いて、次のコードを考えます。

http://mycorp.com/secure.asp?first_name=horatia&last_name=thompson

ユーザーがこの情報をアドレス行に入力するか、これが URL として含まれているリンクをクリックした場合、Web サーバーは結果の HTTP 要求を、GET 要求を使用したフォームの一部として送信されたかのように正確に処理します。ASP アプリケーション内からは、Request オブジェクトの QueryString コレクションを通じてこの情報にアクセスできます。次に例を示します。

<%
strFirstName = Request.QueryString("first_name")
%>

このコードは、strFirstName 変数を first_name パラメータで送信された値に初期化します。QueryString コレクションの詳細については、本章で後述します。

CGI アプリケーションの場合と同じように、POST メソッドを使用して ASP スクリプトに情報を送信できます。この場合、情報は HTTP 要求ヘッダの一部ではなく、Request オブジェクトの本文に含まれます。

<HTML>
<HEAD><TITLE>Welcome to the Corp.</TITLE></HEAD>
<BODY>
<FORM ACTION="http://mycorp.com/secure.asp" METHOD="POST">
First name: <INPUT TYPE="text" NAME="first_name" SIZE=60><BR>
Last name:<INPUT TYPE="text" NAME="last_name" SIZE=60><BR>
<INPUT TYPE="submit" VALUE="Submit the form">
<INPUT TYPE="reset" VALUE="Clear all fields">
</FORM>
</BODY> </HTML>

このフォームを送信すると、次のような HTTP 要求になります。

POST /secure.asp HTTP/1.0
Accept: image/gif, image/jpeg, */*
User-Agent: Mozilla/2.0N (Windows; I; 32Bit)
Content-type: application/x-www-form-urlencoded
Content-length: 35
[mandatory blank line]
first_name=horatio&last_name=aubrey

この HTTP 要求で送信された情報をアプリケーションで操作するには、Request オブジェクトの Form コレクションを使用する必要があります。

<%
strFirstName = Request.Form("first_name")
%>

このコードは、strFirstName 変数を first_name パラメータで送信された値に初期化します。Form コレクションの詳細については、本章で後述します。

ASP の Request オブジェクト  
 
 

ASP の Request オブジェクトのプロパティ、コレクション、メソッド、およびイベントを次のボックスに示します。

Request オブジェクトの概要

プロパティ

TotalBytes

コレクション

ClientCertificate

Cookies

Form

QueryString

ServerVariables

メソッド

BinaryRead

イベント

なし

コメントおよびトラブルシューティング  
 
 

前述した ASP と GET メソッドおよび POST メソッドの説明では、GET からの情報は QueryString コレクションを使用して取得し、POST からの情報は Form コレクションを使用して取得しました。ただし、さらに簡単な方法もあります。その方法の場合、コレクションを指定する必要はありません。その例を次に示します。

strName = Request("name")

このコードは、"name" キーがあるコレクションとは無関係に、このキーの値を返します。これは、IIS がすべてのコレクションを検索するためです。この方法で値を指定すると、ASP は次の順序で各 Request オブジェクトコレクションを検索します。

QueryString

Form

Cookies

ClientCertificate

ServerVariables

初期化する変数は、要求された文字列に名前が一致する "名前/値" のペアの最初のインスタンスの値を受け取ります。このため、複数のコレクションで同じ "名前/値" のペアがある場合は、特定のコレクションを指定しない限り、前述の順序に従って見つかった最初のインスタンスの値を受け取ることを理解しておくことが重要です。

ASP オブジェクトモデルの他のコレクションと同様に、Request オブジェクトに関して本章で説明しているすべてのコレクションは、Item プロパティ、Key プロパティ、Count メソッド、および For..Each 構造をサポートします。

TotalBytes  
Var = Request.TotalBytes
 

TotalBytes プロパティは、HTTP 要求の本文でクライアントが Web サーバーにポストした総バイト数を示す、読み取り専用値です。このプロパティは、Request オブジェクトの BinaryRead メソッドを使用して要求の本文からデータを読み取る準備を行うときに重要です。

 
パラメータ
Var

クライアントが Web サーバーにデータをポストするときに、クライアントの HTTP 要求の本文の総バイト数を受け取ります。TotalBytes プロパティは読み取り専用です。

 

この例では、ユーザーが次のフォームに応答したと想定します。

<HTML>
<HEAD><TITLE>File Upload Form</TITLE></HEAD>
<BODY>
<FORM ENCTYPE = "multipart/form-data" 
ACTION= "http://mycorp.com/secure.asp" METHOD="POST">
Select a file to upload:
<INPUT TYPE="file" NAME="filename"><BR>
<INPUT TYPE="submit" VALUE="Submit the form">
</FORM>
</BODY> </HTML>

TotalBytes プロパティを使用して、HTTP 要求で Web サーバーに送信された情報のバイト数を正確に調べることができます。

<% 
' The following code retrieves the total number of
' bytes sent in the user's HTTP request. This variable
' is then used to determine how many bytes to retrieve
' using the Request object's BinaryRead method.
Dim lngTotalByteCount
Dim vntRequestData

lngTotalByteCount = Request.TotalBytes

vntRequestData = Request.BinaryRead(lngTotalByteCount)

%>
 
メモ

ほとんどの場合、Request オブジェクトの BinaryRead メソッドによって提供された、低レベルの HTTP 要求の本文にあるデータにアクセスする必要はありません。したがって、TotalBytes プロパティの値を取得する必要はありません。ほとんどすべてのデータ要求アクセスには、Form コレクションおよび QueryString コレクションを使用します。

前の例では、vntRequestData の値は、アップロードされたファイルのバイト数だけでなく、送信された総バイト数を表します。つまり、ヘッダ関連のすべての HTTP 情報がこのカウントに含まれます。前述のアップロードからファイルコンテンツのみを取得するには、ヘッダ情報を解析する必要があります。

 
ClientCertificate  
strKeyName = Request.ClientCertificate.Key(3)
strKeyValue = Request.ClientCertificate.Item(strKeyName)
 

Request オブジェクトの ClientCertificate コレクションを使用すると、クライアントのデジタル証明書の証明フィールドにアクセスできます。クライアントのブラウザが SSL (Secure Sockets Layer) をサポートし、SSL が実行されている Web サーバー (URL の先頭が http:// ではなく https://) に接続している場合、クライアント証明書が Web サーバーに送信されます。たとえば、Internet Explorer を使用していて、SSL が実行されている Internet Information Server Web サイトに接続している場合、ブラウザが行った各要求には、クライアント証明書 (存在する場合) が含まれます。クライアント証明書のフィールドは、 国際電気通信連合 (ITU) 勧告 X.509 で規定されています。

ClientCertificate コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。

Item

コレクションの特定の要素の値を返します。アイテムを指定するには、インデックス番号またはキーを使用します。

Key

ClientCertificate コレクションの特定の要素の名前を表します。各要素の値が Item プロパティで表されるのと同じように、各要素の名前が Key プロパティで表されます。

特定のキーの名前が不明な場合は、順序参照を使用して取得できます。たとえば、コレクションの 3 番目のキー名と、要素の名前を知りたいとします。この場合は、次のコードを使用できます。

strKeyName = Request.ClientCertificate.Key(3)
strKeyValue = Request.ClientCertificate.Item(strKeyName)

一方、3 番目の要素のキー名が "ISSUER" であるとわかっている場合は、次のコードを使用してその要素の値を取得できます。

strKeyValue = Request.ClientCertificate.Item("ISSUER")

他の ASP コレクションと同じように、Item プロパティを使用することにより、ClientCertificate コレクションの任意のフィールドの値を取得できます。Item はコレクションのデフォルトプロパティであるため、構文を短縮し、Item プロパティの使用を明示的に表示しないようにできます。次に例を示します。

strCertIssuer = Request.ClientCertificate("Issuer")

このコードは、次のコードの短縮形式です。

strCertIssuer = Request.ClientCertificate.Item("Issuer")

コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。

Key の値として利用できるものは事前定義されており、次のとおりです。

Certificate

証明書コンテンツからのバイナリストリーム全体を含む文字列値。このコンテンツは、データタイプと構造を表すための国際標準である標準の ASN.1 (Abstract Syntax Notation One) フォーマットで取得されます。

Flags

クライアントの証明書に関する追加情報を提供するフラグ。これらのフラグは、定数 ceCertPresent および ceUnrecognizedIssuer によって表すことができますが、VBScript のインクルードファイル cervbs.inc がスクリプトに含まれていることが条件です。インクルードファイルの詳細については、第 11 章を参照してください。定数名が示すように、ceCertPresent は、クライアント証明書が存在することを表し、ceUnrecognizedIssuer は、クライアントのデジタル証明書が不明な証明機関によって発行されたことを表します。

Issuer

クライアントのデジタル証明書の発行者に関するいくつかの情報が含まれた文字列。後で説明する SubKey パラメータが追加された場合、Issuer キーを使用すると、すべての Issuer サブフィールド値のコンマ区切りリスト (C=US、O=VeriSign、GN=Weissinger など) が返されます。

SerialNumber

クライアント証明書のシリアル番号の 16 進数バイトによる ASCII 表現。この値は発行者が提供します。SerialNumber キーを取得すると、0A-B7-34-23 などの数値が得られます。

Subject

デジタル証明書の所有者に関する情報を提供する、コンマ区切り文字列のリスト。SubKey を指定しない場合、Issuer キーについて説明した内容と同様に、サブフィールドのコンマ区切りリスト全体が取得されます。

ValidFrom

証明書が有効になる日。このキーの値は、日時として指定されます。たとえば、ValidFrom キーの使用可能な値は、1/29/98 12:01:00 A.M. (米国の場合) のようになります。

ValidUntil

証明書が無効になる日。このキーの値は、日時として指定されます。たとえば、ValidUntil キーの使用可能な値は、1/28/99 11:59:59 P.M. (米国の場合) のようになります。

一部の Key 値に "サブキー" を追加して、Issuer または Subject キーリストから個別のサブフィールドを取得できます。たとえば、Issuer キーリストから元のサブキー値の国を取得する場合は、次のようにその値を取得します。

Request.ClientCertificate("IssuerC")

Subject キーリストから locality サブキー値を取得する場合は、次の構文を使用してその値を取得します。

Request.ClientCertificate("SubjectL")

サブキーの ASN.1 指定子を使用すると、ここに示さないものも含めて、Certificate キー文字列では特定のサブキーから値を取得できます。ASN.1 識別子は、IP アドレスのようにピリオドで区切った数値のリストですが、たとえば 3.56.7886.34 のように、255 までの数値に制限されません。

利用できるサブキーは次のとおりです。

C

Subject または Issuer の国。

CN

Subject キーの共通名。このサブキーは、Issuer キーについては定義されません。

GN

Subject または Issuer の指定された名前。

I

Subject または Issuer のイニシャル。

L

Subject または Issuer の地域。

O

Subject または Issuer の組織名や会社名。

OU

Subject または Issuer の組織や会社における特定の組織単位の名前。

S

Subject または Issuer の州や都道府県。

T

Subject または Issuer のタイトル。

 
<% 

' The following code retrieves the country of origin
' for the client's certificate issuer.
strCertIssuerCountry = Request.ClientCertificate("IssuerC")

%>

<!-- #include file="cervbs.inc" -->

<%
' The next example code determines whether the
' issuer is recognized by using the flags key.
If Request.ClientCertificate("Flags") _
   and ceUnrecognizedIssuer Then
%>
   Your identification is in question because your issuer 
   is not recognized.
<%
Else
%>
   Welcome to our site.
<%
End If

' Finally, the following code iterates through the 
' ClientCertificate collection and writes the key-key 
' value pairs to the response buffer.
For Each key In Request.ClientCertificate
   Response.Write "The " & key & " key contains the value "
   Response.Write Request.ClientCertificate(key) & "<BR>"
Next 

%>
 
メモ

クライアントのデジタル証明書から情報を取得できるようになるには、クライアントの Web ブラウザで、サイトへの要求に SSL3.0/PCT1 プロトコルを使用する必要があります。そのための最も簡単な方法は、ClientCertificate コレクションから要素の取得を試みることです。

また、クライアント証明書を要求するように IIS Web サーバーを設定しておく必要もあります。

クライアントがデジタル証明書を送信しない場合、ClientCertificate コレクションから取得しようとするキーは空になります。

ITU 勧告 X.509 は、このことについて勧告しています。これは正式な標準としては認められていません。したがって、会社ごとに証明書の機能が少し異なっていたり、取得しようとするすべてのフィールドが含まれていないことがあります。クライアントを正しく識別するためには、ClientCertificate コレクションを信頼する前に、何らかの実験を行うことをお勧めします。

 
Cookies  
Set-Cookie: NAME=VALUE; expires=DATE; domain=DOMAIN_NAME; 
path=PATH; secure
 

Cookies コレクションについて説明する前に、HTTP の Cookie の概念について紹介および説明します。ここでは簡単な概要にとどめます。詳細については、Netscape 社の暫定仕様 (http://www.netscape.com/newsref/std/cookie_spec.html) または Cookie 関連情報のサイト Cookie Central を参照してください。特に、http://www.cookiecentral.com/unofficial_cookie_faq.htm を参照することをお勧めします。

HTTP のようなステートレスプロトコルでは、サーバーとクライアントの両方が、非常に多くの繰り返し処理を実行する必要があることが問題です。たとえば、真にステートレスなプロトコルを使用した場合、Web サーバーは、クライアントがそのサイトのページに移動するたびに、クライアントについて確認する必要があります。これは、同じサイト内の別のページから新しいページに移動する場合でも同様です。同様に、ユーザーの操作は、情報の 1 ページ上で入力および保存するものに制限されます。これは、1 つのページからのデータを保存する何らかの方法がなければ、2 ページ目でそのデータを取得する方法がないためです。

Netscape Communications 社はこの問題を早期に予見し、Web サーバーが Web クライアントのコンピュータ上に少量の情報を保存できるようにする方法を開発しました。クライアントが情報を取得した同じ領域からページを要求するたびに、サーバーにこの情報が送信されます。この少量の情報が、Netscape の Persistent Client State Mechanism つまり "Cookie" として知られるメカニズムの根底にあります。参考までに、Netscape の暫定仕様によれば、このステートオブジェクトが Cookie と名付けられた明確な理由は特にないとのことです。

Cookie の使用により、Web サーバーは安全で取得しやすい方法でクライアントコンピュータに情報を保存でき、これにより、ほとんどの e コマースが可能になります。Web サイトでは、訪問者、最終訪問日時、お気に入りの本などを追跡できるようになります。

Cookie は非常に単純です。 Cookie は、次のフォーマットで Set-Cookie HTTP 応答ヘッダを使用して送信されます。Set-Cookie ヘッダはすべて 1 行である必要があります。

Set-Cookie: NAME=VALUE; expires=DATE; domain=DOMAIN_NAME; 
path=PATH; secure

この構文は次のように構成されます。

NAME=VALUE

Web サーバーがクライアントコンピュータに保存する Cookie の "名前/値" のペア。この値には、空白スペース、コンマ、またはセミコロンを除く任意の文字を含めることができます。Cookie のこの部分は必須です。

expires

ブラウザが Cookie を破棄できる日を保持します。expires 属性が指定されない場合、デフォルトで現在の HTTP セッションの終了時に設定されます。有効期限日のフォーマットは次のとおりです。

Wdy, DD-Mon-YYYY HH:MM:SS GMT

使用できるのはグリニッジ標準時のみです。

domain

ユーザーが特定の URL に移動するたびに、ユーザーのコンピュータのすべての Cookie のドメイン属性が、URL のドメインに対して比較されます。ユーザーのコンピュータの任意の Cookie のドメイン属性が、URL ドメインの末端部分 (完全なドメイン名の最後の 2 つのセグメント) に一致する場合、その Cookie は URL への Request ヘッダ (後で説明します) として送信されます。ドメインは、クライアントに送信される Cookie のドメイン属性を設定するために、少なくとも 2 つのピリオドを名前に含んでいる必要があります。たとえば、www.microsoft.com の場合は、クライアントに Cookie を送信できますが、mydomain.com の場合は送信できません。Microsoft 関連 Cookie の domain 属性の実際の値は Microsoft.com となります。

この Cookie は、www.microsoft.comhome.microsoft.com など、Microsoft.com で終わる任意の URL に送信されます。同じように、このドメイン内のページのみが、このドメイン属性で Cookie を設定できます。たとえば、www.microsoft.comMicrosoft.com ドメインを持つ Cookie を送信できますが、www.ora.com はこれを送信できません。

クライアントブラウザに送信される Cookie にドメイン属性が含まれていない場合、Cookie の送信元のドメイン名がデフォルトで使用されます。これは省略可能なパラメータです。

path

Cookie の domain 属性によって定義されたドメイン内の URL のサブセット。この値により、Cookie がサーバーに送信されるかどうかが決まります。パス属性が送信されない場合、ブラウザが表示しているドキュメントのパスがデフォルトで使用されます。たとえば、パス属性を設定しない http://www.oreilly.com/newtitles/upcoming.ASP からの Cookie は、デフォルトで /newtitles/ に設定されます。ブラウザは、このパスのページのみに、このページからの Cookie を送信します。ドメインの最も一般的なパスは "/" です。これは省略可能な属性です。

パスに関する説明では、わかりにくい点が生じることもあります。ブラウザのコンピュータは、パスの各ページごとに 1 つの Cookie を保存するのでしょうか。それとも、繰り返し使用される 1 つの Cookie のみを保存するのでしょうか。ブラウザは個別の Cookie 値ごとに Cookie を保存する、というのが正解です。現在のページの複数の Cookie 値を含む 1 つの Cookie は存在しません。各 Cookie 値には、それぞれ独自のエントリがあります。

secure

Cookie に対して存在する場合、サーバーとブラウザが保護されたチャネル (HTTPS など) で通信しているときは、path プロパティで指定されたパス内のページのみにこの Cookie を送信するようにブラウザに指示します。

ローカルコンピュータ上に Cookie が存在する URL にユーザーが移動した場合、ブラウザは次のフォーマットで Request ヘッダを送信します。

Cookie:Name1=Value1;Name2=Value2;...NameX=ValueX;

ここで、各値の意味は次のとおりです。

NameX

その URL の Cookie の名前。

ValueX

名前 NameX を持つ、対応する Cookie の値。この値は、スペース、セミコロン、またはコンマを含まない文字列である必要があります。

例を使用してわかりやすく説明します。クライアントが URL に移動し、そのブラウザが次の HTTP 応答ヘッダを受け取ったとします。

Set-Cookie: userid=a.keyton.weissinger; domain=yourbooks.com;
path=/; expires=Thursday, 10-Nov-2000 23:59:59

Set-Cookie: usersel=aspbooks; domain=yourbooks.com;
path=/sales/; expires=Monday, 01-Jan-2010 23:59:59

この時点から 2000 年 11 月 10 日 23 時 59 分までの間、最後の 2 つのセグメントが yourbooks.com であるドメイン内の任意のページにクライアントが移動するたびに、最初の Cookie が Web サーバーに送信されます。HTTP 要求ヘッダは次のようになります。

Cookie: userid=a.keyton.weissinger

この時点から 2010 年 1 月 1 日 23:59 までの間、パスが /sales/something である yourbooks.com ドメインの任意のページに 2 番目の Cookie が送信されます。たとえば、次の Cookie 要求ヘッダがあるとします。

Cookie: usersel=aspbooks

このヘッダは、http://www.yourbooks.com/sales/default.ASP または http://www.yourbooks.com/sales/final/asp に送信され、http://www.yourbooks.com/sales/checkout/default.ASP に送信されることもあります。

最後に、両方の条件セット (useridusersel の両方の Cookie) が満たされると、次の Cookie ヘッダがユーザーのブラウザによって送信されます。

Cookie: userid=a.keyton.weissinger; usersel=aspbooks

Cookie を広範囲に使用する予定の場合は、Cookie について知っておく必要がある詳細が他にもあります。詳細については、前述のリファレンスを参照してください。この簡単な概要に続き、ここでは Request オブジェクトの Cookies コレクションについて説明します。

Request オブジェクトの Cookies コレクションを使用すると、ASP アプリケーションではクライアントの HTTP 要求の本文から Cookie と Cookie 辞書アイテムの値を取得できます。

Cookies コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。

Item

コレクションの特定の Cookie の値を表します。Cookie を指定するには、インデックス番号またはキーを使用します。

Key

Cookies コレクションの特定の要素の名前を表します。各要素の値が Item プロパティで表されるのと同じように、各要素の名前が Key プロパティで表されます。

特定のキーの名前が不明な場合は、順序参照を使用して取得できます。たとえば、コレクションに含まれる 3 番目の要素のキー名を取得してから、その要素の値を取得するとします。この場合は、次のコードを使用できます。

strKeyName = Request.Cookies.Key(3)
strKeyValue = Request.Cookies.Item(strKeyName)

一方、3 番目の要素のキー名が "STATE" であるとわかっている場合は、次のコードを使用してその要素の値を取得できます。

strKeyValue = Request.Cookies.Item("STATE")
Count

コレクションに含まれる要素の数を表します。

他の ASP コレクションと同じように、Item プロパティを使用することにより、Cookies コレクションの任意のフィールドの値を取得できます。ここでの例と説明では、構文が短縮されているので、Item プロパティの使用を明示的に示しているわけではありません。次に例を示します。

strLastSearch = Request.Cookies("LastSearch")

このコードは、次のコードの短縮形式です。

strLastSearch = Request.Cookies.Item("LastSearch")

コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。

Cookies コレクションの Cookie は、単純な値を保存することに加えて、 Cookie 辞書を表すことができます。辞書は、配列の各要素が名前で識別可能な点において、連想配列に似た構造です。

ただし、Cookie は Cookie 辞書を含むことができても、オブジェクトなど、より複雑なデータタイプを含むことはできないことに注意する必要があります。

Cookie 辞書内の特定の値を調べるには、SubKey を使用する必要があります。たとえば、特定の Cookie が、Web ページでユーザーが選択した 5 つの色を表すとします。Cookie そのものは Colors という名前になり、サブキーは、color1color2、. . . color5 という名前になります。color3 にある値を調べるには、次のコードを使用します。

strColor3 = Request.Cookies("Colors")("color3")

特定の Cookie にサブキーがあるかどうかを調べるには、 次のように、その特定の Cookie の HasKeys プロパティを使用する必要があります。

blnHasKeys = Request.Cookies("Colors").HasKeys
If blnHasKeys Then
   strColor3 = Request.Cookies("Colors")("color3")
End If
 
<% 
' The following code iterates through the Cookies collection.
' If a given cookie represents a cookie dictionary, then
' a second, internal for...each construct iterates through
' it retrieving the value of each subkey in the dictionary.
Dim strCookie
Dim strSubKey

Dim str3rdCookieValue
Dim strCompanyCookieValue

For Each strCookie In Request.Cookies
   If Request.Cookies(strCookie).HasKeys Then

      ' The cookie is a dictionary. Iterate through it.
%>
      The cookie dictionary <%=strCookie%> has the
      following values:
<%
      For Each strSubKey In Request.Cookies(strCookie)
%>
         &nbsp; &nbsp; SubKey: <%= strSubKey %><BR>
         &nbsp; &nbsp; Value:
         <%=Request.Cookies(strCookie)(strSubKey)%><BR>
<%      
      Next
   Else
      ' The cookie represents a single value.
%>
      The cookie <%=strCookie%> has the following value:
      <%=Request.Cookies(strCookie)%> <BR>
<%
   End If

Next

' The following code retrieves the value of the third cookie
' in the Cookies collection.
str3rdCookieValue = Request.Cookies(3)

' The following code retrieves the value of the "company" 
' cookie in the Cookies collection.
strCompanyCookieValue = Request.Cookies("Company")

%>
 
メモ

Cookie 辞書を表す Cookie にアクセスする場合、サブキーを指定しないときは、次のような文字列値が取得されます。

FirstSubKey=FirstSubKeyValue&SecondSubKey=SecondSubKeyValue

クライアントコンピュータの Cookie 構造の一部に、クライアントが Cookie を受け取った Web ページを表すパスがあります。名前が同じでパスが異なる 2 つの Cookie が存在する場合、Cookie 値の取得に関する重要な点が現れます。このような場合、Cookie を取得しようとすると、より深い階層のディレクトリの Cookie のみが取得されます。たとえば、Web ページ http://www.MyCompany.com/ContribApp/Contrib1.ASPUserPref という名前の Cookie があり、2 番目の Web ページは http://www.MyCompany.com/ContribApp/Addresses/AddrContrib1.ASP というさらに深い階層で UserPref という名前の Cookie を持つ場合、UserPref Cookie を取得しようとすると、2 番目の UserPref Cookie のみが取得されます。

Cookie 辞書を表していない Cookie 名のサブキーの値を取得しようとすると、結果は null になります。このため、サブキーの値を取得しようとする前に、HasKeys プロパティを利用することが重要です。

HTTP Persistent Client State Mechanism (Cookie) は、常に発展している勧告です。Cookie の草案は 6 か月のみ有効です。本マニュアルの作成時点での草案は ftp://ftp.isi.edu/internet-drafts/draft-ietf-http-state-man-mec-08.txt で参照できます。

このドキュメントまたは最新版からは、Cookie 仕様の最新の草案が、Netscape が当初提案した範囲をはるかに超えていることがわかります。Request オブジェクトの現在の Cookies コレクションは、この仕様の一部をサポートしているだけです。草案が標準化されるときは、Request オブジェクトの Cookies コレクションを通じて、Cookie のより多くの機能を利用できるようになると考えられます。

 
Form  
<FORM ACTION = "RecordPrefs.asp" METHOD = POST>
Name: <INPUT TYPE = TEXT NAME = "Name"><BR>
Color Pref: <SELECT NAME = "optColor">
<OPTION VALUE = "red" SELECTED>Red
<OPTION VALUE = "blue" >Blue
<OPTION VALUE = "green" >Green   
</SELECT><BR>
Have a Modem? <INPUT TYPE = CHECKBOX NAME = "Modem"><BR>
<INPUT TYPE=submit VALUE=submit>
</FORM>
 

Form コレクションを使用すると、クライアントの HTML フォームに入力されて POST メソッドを使用してサーバーに送信された情報を取得できます。この情報は、クライアントが送信した HTTP 要求の本文にあります。

Form コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。

Item

コレクションの特定の要素の値を表します。アイテムを指定するには、インデックス番号またはキーを使用します。Form コレクションの場合、インデックス番号が HTML フォームの要素の番号を表します。たとえば、次の HTML フォームがあるとします。

<FORM ACTION = "RecordPrefs.asp" METHOD = POST>
Name: <INPUT TYPE = TEXT NAME = "Name"><BR>
Color Pref: <SELECT NAME = "optColor">
<OPTION VALUE = "red" SELECTED>Red
<OPTION VALUE = "blue" >Blue
<OPTION VALUE = "green" >Green   
</SELECT><BR>
Have a Modem? <INPUT TYPE = CHECKBOX NAME = "Modem"><BR>
<INPUT TYPE=submit VALUE=submit>
</FORM>

RecordPrefs.ASP 内からは、最初の要素 (要素 1) が "Name" になります。3 番目の要素は "Modem" です。この数は 1 から始まります。

Key

Form コレクションの特定の要素の名前を表します。各要素の値が Item プロパティで表されるように、各要素の名前が Key プロパティで表されます。

特定のキーの名前が不明な場合は、順序参照を使用して取得できます。たとえば、コレクションに含まれる 3 番目の要素のキー名を取得してから、その要素の値を取得するとします。この場合は、次のコードを使用できます。

strKeyName = Request.Form.Key(3)
strKeyValue = Request.Form.Item(strKeyName)

一方、3 番目の要素のキー名が "STATE" であるとわかっている場合は、次のコードを使用してその要素の値を取得できます。

strKeyValue = Request.Form.Item("STATE")

Form 要素が保存される順序は、常に信頼できるとは限りません。たとえば、送信されるフォームに 8 個のアイテムがあるとします。この場合、フォームの最初の要素が、Form コレクションの最初の要素であるとは限りません。このため、目的の Form コレクションの特定の要素を識別するには、常にキー文字列を使用する必要があります。

Count

コレクションに含まれる要素の数を返します。

他の ASP コレクションと同じように、Item プロパティを使用することにより、Form コレクションの任意のフィールドの値を取得できます。以下の例と説明では、構文が短縮されているので、Item プロパティの使用を明示的に示しているわけではありません。次に例を示します。

strFirstName = Request.Form("txtFirstName")

このコードは、次のコードの短縮形式です。

strFirstName = Request.Form.Item("txtFirstName")

コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。

Request オブジェクトの Form コレクションの例では、すべて次の HTML フォームを使用します。

<HTML>
<HEAD>
<TITLE>User Information</TITLE>
</HEAD>
<BODY>
<CENTER>
<H1>User Information</H1>
Please enter your user information using the form below:
<FORM NAME = "frmInfo" ACTION="UserInfo.ASP" 
      METHOD = "POST">
First Name:  <INPUT TYPE="text" NAME = "txtFirstName"><BR>
Last Name:   <INPUT TYPE="text" NAME = "txtLastName"><BR>
Zipcode:     <INPUT TYPE="text" NAME = "txtZipCode"><BR>
Occupation:  <INPUT TYPE="text" NAME = "txtOccupation"><BR>
Please select your connection speed:
<SELECT NAME = "optConnSpeed">
<OPTION VALUE = "28.8" SELECTED>28.8 Modem
<OPTION VALUE = "ISDN" >ISDN
<OPTION VALUE = "T1" >T1   
<OPTION VALUE = "T3" >T3
</SELECT><BR>
Below, select all the peripherals you have: 
<INPUT TYPE = "checkbox" NAME = "chkPeriph" 
       VALUE = "Joystick">Joystick<BR>
<INPUT TYPE = "checkbox" NAME = "chkPeriph" 
       VALUE= "GraphicsAccel">3D Graphics Card<BR>
<INPUT TYPE = "checkbox" NAME = "chkPeriph" 
        VALUE = "Printer">Printer<BR>
<BR>
Check here if it's ok to send your information: 
<INPUT TYPE = "checkbox" NAME = "chkSellInfo"><BR>

<INPUT TYPE = "Submit" VALUE = "Submit User Info">

</FORM>
</BODY>
</HTML>

クライアントがフォームの [Submit] ボタンをクリックすると、HTTP の Post メソッドを通じて、HTTP 要求の本文でフォームの情報が Web サーバーに送信されます。

次のコードでは、UserInfo.ASP で使用して、前述の例のフォーム frmInfo で特定の要素の値を調べることができます。このコードでは、コードを記述する前に、フォームで処理するフィールドを正確に把握している必要があります。

<%

' The following code example demonstrates the use of
' the Form collection of the Request object to retrieve
' the values entered by the client into an HTML form.
Dim strFirstName
Dim strLastName
Dim strZipCode
Dim strOccupation
Dim blnSendInfo
Dim strConnSpeed
Dim intPeriphCount
Dim aryPeripherals( )
Dim chkItem

intPeriphCount = 0

' Retrieve the information from the form's text boxes.
strFirstName    = Request.Form("txtFirstName")
strLastName     = Request.Form("txtLastName")
strZipCode      = Request.Form("txtZipCode")
strOccupation   = Request.Form("txtOccupation")

' Retrieve the information from the Sell Information
' checkbox.
blnSendInfo     = Request.Form("chkSellInfo")

' Determine the connection speed from the Connection
' Speed option buttons.
strConnSpeed    = Request.Form("optConnSpeed")

' Populate an array with the peripherals the user has.
For Each SubKey in Request.Form("chkPeriph")
   ReDim Preserve aryPeripherals(intPeriphCount + 1)
   intPeriphCount = intPeriphCount + 1
   aryPeripherals(intPeriphCount) = _
      Request.Form("chkPeriph")(intPeriphCount)

Next
%>
 
メモ

インデックスを使用せずに要素を参照し、その要素に複数の値が含まれている場合、コンマ区切り文字列が返されます。たとえば、本章で前述した Form コレクションの chkPeriph 要素と共にサブキーを使用する代わりに、次のコード行を挿入したとします。

response.write Request.Form("chkPeriph")

3 つすべてのオプション (JoystickGraphicsAccel、および Printer) を選択したとすると、このコード行によって次の文字列が発生します。

Joystick, GraphicsAccel, Printer

アプリケーションでは、クライアントの HTTP 要求から未解析データを取得することもできます。HTTP 要求の本文から未解析データを取得するには、パラメータを使用せずに Request.Form を使用します。未解析の HTTP 要求 (特にバイナリデータ) をこの方法で使用すると、問題が発生することがあります。ただし、バイナリデータをより効率的に取得するために使用可能な、いくつかの ActiveX コントロールと Java アプレットがあります。

HTML フォームから ASP アプリケーションに情報を送信するには、<FORM> タグの ACTION 属性を、HTML フォームデータを処理するファイルの名前に設定する必要があります。この Active Server Page は、同じ仮想ディレクトリに置くか、仮想ディレクトリを使用して指定できます。これは HTML ページ、または他の ASP ファイルから行うことができます。ただし、このプロセスの最も強力な使用方法の 1 つは、プロセス自身を呼び出す ASP を作成することです。この方法は必ずしも高速ではありませんが、効率的です。

次の例では、同じ ASP によって入力データが処理される HTML フォームを作成する、単純な ASP を示します。

<%
' UserInfo2.ASP
' The following code determines whether the HTML form (see  
' the bottom portion of the script) has been filled out. If 
' it has, then some processing takes place and one HTML output  
' is sent back to the client. If not, the HTML form is sent to 
' the client.
If Not IsEmpty(Request.Form("txtFirstName")) And _
   Not IsEmpty(Request.Form("txtLastName")) Then

   ' The form has been filled out and the reply is
   ' a brief thank you.
%>
   <HTML>
   <HEAD><TITLE>Thank You</TITLE>
   </HEAD>
   <BODY>
   Thank you, <%= Request.Form("txtFirstName")%>&nbsp 
<%= Request.Form("txtLastName")%> for your information. 
Have a nice day.
   </BODY>
   </HTML>
<%
Else
%>
   <HTML>
   <HEAD><TITLE>Thank You</TITLE>
   </HEAD>
   <BODY>
   
   <FORM NAME = "frmInfo" ACTION="UserInfo2.ASP" 
         METHOD = "POST">
   First Name:  <INPUT TYPE="text" NAME="txtFirstName"><BR>
   Last Name:   <INPUT TYPE="text" NAME="txtLastName"><BR>

   <INPUT TYPE = "Submit" VALUE = "Submit User Info">
   
   </FORM>
   </BODY>
   </HTML>
<%
End If

%>

このスクリプトは、クライアントでフォーム要素への入力が行われたかどうかを最初に調べます。入力が行われた場合、スクリプトはクライアントに短い "謝辞" を送信して終了します。入力が行われなかった場合は、ユーザーにフォームが表示されます。ここでは初歩的なフォームしか使用しませんが、この技法は非常に強力であり、ASP アプリケーション開発で困難な作業となることがある、コードのモジュール化で非常に役立ちます。

標準の HTML フォーム要素に加えて (またはその代わりに) ActiveX コントロールが HTML フォームに含まれている場合は、同じ方法でその値を参照できます。たとえば、1 つの Microsoft Forms 2.0 テキストボックスを含む、次の単純な HTML フォームがあるとします。

<FORM NAME = "frmInfo" ACTION="UserInfo.ASP" 
      METHOD = "POST">
First Name:   
<OBJECT NAME = "txtFirstName" WIDTH=211 HEIGHT=20
   CLASSID="CLSID:8BD21D10-EC42-11CE-9E0D-00AA006002F3">
   <PARAM NAME="VariousPropertyBits" VALUE="746604571">
   <PARAM NAME="BackColor" VALUE="16777215">
   <PARAM NAME="MaxLength" VALUE="255">
   <PARAM NAME="Size" VALUE="5574;529">
   <PARAM NAME="Value" VALUE=">
   <PARAM NAME="BorderColor" VALUE="0">
   <PARAM NAME="FontCharSet" VALUE="0">
   <PARAM NAME="FontPitchAndFamily" VALUE="2">
   <PARAM NAME="FontWeight" VALUE="0">
</OBJECT>
<INPUT TYPE = "Submit" VALUE = "Submit User Info">

</FORM>

次のコード行を使用して、UserInfo.ASP からテキストボックスに入力された値を参照できます。

strFirstName = Request.Form("txtFirstName")

クライアントサイドスクリプトを使用して検証される値を持つ ActiveX コントロールが含まれた HTML フォームがある場合は、送信ボタンなど、どの要素にも、Submit という名前が含まれていないようにする必要があります。これは些細なことのようですが、これを見落とすと、フォームを送信できなくなります。確認してみてください。

Form コレクションのデータは、HTTP 要求の本文のデータのみを表します。HTTP の Get メソッドを使用して、クライアントからサーバーにデータを送信することもできます。Get を使用すると、クライアントからの情報が HTTP 要求ヘッダで送信されます。このデータを取得するには、Request オブジェクトの QueryString コレクションを使用する必要があります。

 
QueryString  
strKeyName = Request.QueryString.Key(3)
strKeyValue = Request.QueryString.Item(strKeyName)
 

QueryString コレクションを使用すると、クライアントが HTML フォームで Get メソッドを使用してページを要求したときに、その URL に追加されたデータから情報を取得できます。QueryString コレクションは Form コレクションよりも機能が低くなっています。これは、HTTP 要求のヘッダで送信されるデータの量に制限があるためです。経験上、この制限はおおよそ 2000 文字です。これ以上の数の文字を QueryString の一部として送信しても、文字は処理されません。ただし、スクリプトの実行は継続されます。

QueryString コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。

Item

コレクションの特定の要素の値を返します。アイテムを指定するには、インデックス番号またはキーを使用します。QueryString コレクションの場合、インデックス番号は URL に指定される要素の番号、または HTML フォームの要素の番号を表します (データの送信に GET メソッドを使用する場合)。ただし、フォームデータの送信に POST メソッドを使用する場合、これらの HTML 要素は QueryString コレクションには存在せず、Request オブジェクトの Form コレクションに存在します。

Key

QueryString コレクションの特定の要素の名前を返します。各要素の値が Item プロパティで表されるのと同じように、各要素の名前が Key プロパティで表されます。

特定のキーの名前が不明な場合は、順序参照を使用して取得できます。たとえば、コレクションに含まれる 3 番目の要素のキー名を取得してから、その要素の値を取得するとします。この場合は、次のコードを使用できます。

strKeyName = Request.QueryString.Key(3)
strKeyValue = Request.QueryString.Item(strKeyName)

一方、3 番目の要素のキー名が "STATE" であるとわかっている場合は、次のコードを使用してその要素の値を取得できます。

strKeyValue = Request.QueryString.Item("STATE")
Count

コレクションに含まれる要素の数。

他の ASP コレクションと同じように、Item プロパティを使用することにより、QueryString コレクションの任意のフィールドの値を取得できます。以下の例と説明では、構文が短縮されているので、Item プロパティの使用を明示的に示しているわけではありません。次に例を示します。

strFirstName = Request.QueryString("FirstName")

このコードは、次のコードの短縮形式です。

strFirstName = Request.QueryString.Item("FirstName")

コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。

<% 
' This code iterates through the QueryString collection
' and fills an array with the values retrieved.
Dim item
Dim aryQueryValues( )
Dim intItemCount

intItemCount = 0

For Each item In Request.QueryString
   ReDim Preserve aryQueryValues(intItemCount + 1)
   aryQueryValues(intItemCount) = _ 
                  Request.QueryString(item)
   intItemCount = intItemCount + 1
Next
%>
 
メモ

Form コレクションの要素と同じように、QueryString コレクションの要素も複数の値を表すことができます。たとえば、ASP ファイルが次の HTML フォームからの送信を受け取るとします。

<FORM NAME = "frmInfo" ACTION="UserInfo2.ASP" 
      METHOD = "GET">
Below, select all the peripherals you have: 
<INPUT TYPE = "checkbox" NAME = "chkPeriph" VALUE = 
   "Joystick">Joystick<BR>
<INPUT TYPE = "checkbox" NAME = "chkPeriph" VALUE=
   "GraphicsAccel">3D Graphics Card<BR>
</FORM>

ユーザーが両方のチェックボックスをオンにしたとします。結果の情報は、次の URL を使用して ASP が要求されたかのように、ASP で完全に解釈されます。

UserInfo2.ASP?chkPeriph=Joystick&chkPeriph=GraphicsAccel

最初の要素を参照するには、次のコードを使用します。他の ASP コレクションと同じように、要素は 1 で始まります。

strFirstOption = Request.QueryString("chkPeriph")(1)

次のように、サブキーを指定しないとします。

strOptions = Request.QueryString("chkPeriph")

この場合、strOptions には次の値が含まれます。

Joystick, GraphicsAccel

QueryString コレクションには、Form コレクションと同じように、クライアントから Web サーバーに送信された情報が含まれます。この情報の形式としては、HTTP 要求ヘッダで要求された URL の最後に追加される "パラメータ/値" のペア、ブラウザのアドレスフィールドで URL に追加される "パラメータ/値" のペア、またはアクションが HTTP の Get メソッドに設定される HTML フォームからの "パラメータ/値" のペアの各形式があります。

QueryString コレクションの使用にはいくつかの制限がありますが、そのうち最も重要なものは長さの制限です。この長さはクライアントと Web サーバーで利用できるメモリ容量によって異なりますが、QueryString コレクションを使用してクライアントからサーバーに ~1800 を超える文字を送信できると見込むことはできません。この ~1800 文字の "制限" は、送信されるパラメータの値だけでなく名前も含み、要求された URL に追加されたパラメータリストの最後に呼び出されたスクリプト名の最後から数えた値です。

Form コレクションの要素と同じように、QueryString コレクションの要素も複数の値を含むことができます。コレクションの特定の要素で利用できる値の数を調べるには、 要素の Count プロパティを使用します。Count プロパティの値は、要素に含まれている値の数に等しくなり、要素がコレクションにない場合は 0 になります。

特定の要素のインデックスパラメータを指定しないことにより、複数の値を持つ要素のすべての値を取得できます。値は、対象の要素からの値のみを含む、コンマ区切り文字列として返されます。

Form コレクションと同じように、QueryString コレクションの未解析データを取得できます。未加工で未解析の QueryString コレクションデータを取得するには、要素のパラメータを指定せずに Request.QueryString 構文を使用します。

QueryString コレクションのデータは、HTTP_QUERYSTRING パラメータを使用して、Request オブジェクトの ServerVariables コレクションからもアクセスできます。この詳細については、ServerVariables コレクションの項で説明します。

最後に、QueryString で使用する場合は、いくつかの特殊文字をエンコードする必要があります。

&

アンパサンドは、QueryString コレクションに追加された別の "パラメータ/値" のペアを記述するために使用します。

?

疑問符は、クライアントから URL で要求されたファイル名の拡張子の後に追加する QueryString の先頭を示します。

%

パーセント記号は、他の特殊文字のエンコードで使用します。

+

プラス記号は、QueryString ではスペースを表すものとして認識されます。

これらの文字は、サーバー側の Server オブジェクト、およびクライアント側のカスタムスクリプトの URLEncode メソッドと HTMLEncode メソッドを使用して自動的にエンコードできます。

 
ServerVariables  
strKeyName = Request.ServerVariables.Key(3)
strKeyValue = Request.ServerVariables.Item(strKeyName)
 

ServerVariables コレクションでは、クライアントによる Web サーバーに対する特定の HTTP 要求のコンテキストで、事前定義されたいくつかの環境変数が含まれます。

ServerVariables コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。

Item

コレクションの特定の要素の値。アイテムを指定するには、インデックス番号またはキーを使用します。

Key

ServerVariables コレクションの特定の要素の名前を返します。各要素の値が Item プロパティで表されるのと同じように、各要素の名前が Key プロパティで表されます。

特定のキーの名前が不明な場合は、順序参照を使用して取得できます。たとえば、コレクションに含まれる 3 番目の要素のキー名を取得してから、その要素の値を取得するとします。この場合は、次のコードを使用できます。

strKeyName = Request.ServerVariables.Key(3)
strKeyValue = Request.ServerVariables.Item(strKeyName)

一方、3 番目の要素のキー名が "QUERY_STRING" であるとわかっている場合は、次のコードを使用してその要素の値を取得できます。

strKeyValue = _
          Request.ServerVariables.Item("QUERY_STRING")

または、次のコードを使用します。

strKeyValue = Request.ServerVariables("QUERY_STRING")
Count

コレクションに含まれる要素の数。

他の ASP コレクションと同じように、Item プロパティを使用することにより、ServerVariables コレクションの任意のフィールドの値を取得できます。以下の例と説明 (および他のソースからの例のほとんど) では、構文が短縮されているので、Item プロパティの使用を明示的に示しているわけではありません。次に例を示します。

strRemoteAddr = Request.ServerVariables("REMOTE_ADDR")

このコードは、次のコードの短縮形式です。

strRemoteAddr = Request.ServerVariables.Item("REMOTE_ADDR")

コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。

Key の使用可能な値を、次のリストに示します。通常、これらの値は大文字で表示されますが、Key では実際には大文字と小文字は区別されません。他の ASP アプリケーションからの要素と同じように、ServerVariables コレクションからの要素名は、インデックス番号を使用して取得できます。ただし、次のリストは、要素が ServerVariables コレクションに存在する順ではなく、アルファベット順になっていることに注意が必要です。

ALL_HTTP

クライアントのブラウザが送信する、すべての HTTP ヘッダを含む 1 つの長い文字列。次の各要素は、この要素から解析できます。

ALL_RAW

クライアントのブラウザが送信する、元の状態ですべての HTTP ヘッダを含む 1 つの長い文字列。ALL_RAW 値と ALL_HTTP 値の主な違いは、ALL_HTTP 要素の値にはすべて接頭辞 HTTP_ が付き、ヘッダ名は常に大文字になることです。次の各要素は、この要素から解析できます。

APPL_MD_PATH

IIS メタベースは、内部的にはサーバーのすべての設定を保持します。メタベースの機能は、Microsoft 管理コンソール (Microsoft Management Console) にスナップインとして追加されたアイテムに関する情報だけを保持すること以外は、レジストリに似ています。これには、Internet Information Server、Index Server、SQL Server 7.0 などが含まれます。メタベースの情報は、ほとんどインストールおよび構成情報だけを表します。

ServerVariables コレクションの APPL_MD_PATH 要素は、 ISAPI DLL のメタベース固有のパスを表します。これは、サーバー上の物理的な場所ではなく、ISAPI DLL の呼び出し元となるメタベースパスです。たとえば、Personal Web Server が実行されている Windows 95 コンピュータでは、この要素の値は次のようになります。

/LM/W3SVC/1/ROOT
APPL_PHYSICAL_PATH

APPL_MD_PATH 要素の物理パス。この値は、IIS による APPL_MD_PATH の変換から取得されます。たとえば、前述のシステムでは、C:\Inetpub\wwwroot\ に変換されます。

AUTH_PASSWORD

IIS のセキュリティが基本認証に設定された場合、AUTH_PASSWORD は、クライアントが Web サーバーにログインしたときに認証ボックスに入力された パスワードを表します。パスワードが入力されていない場合、この値は null 文字列になります。

AUTH_TYPE

Web サーバーに設定された認証方法。この認証方法は、Windows NT セキュリティで保護されているサーバーでスクリプトを要求するすべてのユーザーを確認するために使用されます。

AUTH_USER

Web サーバーによってクライアントの認証時に入力された、未加工のユーザー名。

CERT_COOKIE

クライアントのデジタル証明書の固有の ID。この要素の値は、証明書全体の署名として使用できます。この要素には、HTTPS プロトコルを使用するクライアントのみの値が含まれます。 ClientCertificate コレクションには、クライアント関連のすべてのデジタル証明書情報が含まれます。ClientCertificate コレクションは、HTTP ヘッダ情報よりも使いやすくなっています。クライアントがデジタル証明書を送信しない場合でも、これらの CERT_ 要素は ServerVariables コレクションに存在しますが、空であり、値は含まれません。

CERT_FLAGS

CERT_FLAGS 2 ビットの値を表します。クライアント証明書が存在する場合、ビット #0 は 1 に設定されます。クライアント証明書の証明機関が無効な場合、つまり Web サーバーにある確認済みの証明書発行者のリストで発行者が見つからない場合、ビット #1 は 1 に設定されます。これらの値は、ClientCertificate コレクションの Flags 要素の ceCertPresent 定数および ceUnrecognizedIssuer 定数に対応します。

CERT_ISSUER

クライアント証明書の発行者 (存在する場合)。この要素の値は、本章の ClientCertificate コレクションの Issuer 要素の項で説明した、使用可能な各サブ要素のサブフィールドが含まれたコンマ区切り文字列です。

CERT_KEYSIZE

SSL 接続キーサイズで使用されるビット数 (たとえば、64 または 128)。

CERT_SECRETKEYSIZE

サーバー証明書の秘密キーのビット数 (たとえば、1024)。

CERT_SERIALNUMBER

クライアントの証明書のシリアル番号値。

CERT_SERVER_ISSUER

サーバー証明書の発行者。

CERT_SERVER_SUBJECT

サーバー証明書のサブジェクトフィールド。この要素の値は、クライアント証明書のサブジェクトフィールドと同じように、ClientCertificate コレクションのサブジェクト要素で説明したサブフィールドが含まれたコンマ区切り文字列です。

CERT_SUBJECT

クライアント証明書のサブジェクトフィールド。この要素の値は、ClientCertificate コレクションのサブジェクト要素で説明したサブフィールドが含まれたコンマ区切り文字列です。

CONTENT_LENGTH

クライアントが送信した HTTP 要求の本文の合計の長さ。この値を使用して、クライアントの HTTP 要求にある未加工の HTTP コンテンツの長さを調べることができます。この値は要求ヘッダによって提供されたデータ (GET メソッドで送信された情報) を含まず、要求本文の情報のみを含みます。

CONTENT_TYPE

クライアントが送信したコンテンツの MIME タイプ。HTTP の GET アクション、POST アクション、PUT アクションなどの添付情報を含む HTTP クエリーと共に使用すると、クライアントの HTTP 要求コンテンツデータのデータタイプを調べることができます。この要素の最も一般的な値は、application/x-www-form-urlencoded です。HTML フォームにファイル要求を含める場合は、 ENCTYPE パラメータ (および要求の CONTENT_TYPE ヘッダ) を multipart/form-data に設定します。

GATEWAY_INTERFACE

Web サーバーによって使用される CGI (Common Gateway Interface) のリビジョン。この文字列値のフォーマットは、CGI/revision # です。たとえば、IIS 4.0 Web サーバーに接続されている場合、このアイテムの値は CGI/1.1 になります。

HTTP_ [HeaderName]

headername という名前の、HTTP ヘッダで送信される値。このリストにない HTTP ヘッダ (カスタムヘッダを含む) の値を取得するには、ヘッダ名に接頭辞 HTTP_ を付ける必要があります。HTTP_CUSTOM_SELECTION ヘッダを指定すると、IIS は実際には HTTP 要求でクライアントによって Custom-Header というラベルが付けられた HTTP ヘッダを検索します。したがって、ServerVariables コレクションで名前にハイフンがある HTTP ヘッダを検索するときは、代わりにアンダースコアを使用します。存在しないヘッダを取得しようとすると、エラーではなく、空の文字列が返されます。たとえば、次のコードがあります。

  • HTTP_ACCEPT
  • HTTP_AUTHORIZATION (AUTH_TYPE 要素と同じ)
  • HTTP_ACCEPT-LANGUAGE
  • HTTP_CONNECTION
  • HTTP_HOST
  • HTTP_REFERER
  • HTTP_USER-AGENT

これらのコードが値を受け取るためには、次のようなコードが必要です。

strUserAgent = _
         Request.ServerVariables("HTTP_USER_AGENT")
HTTPS

この要素の値は、クライアントの HTTP 要求が SSL を使用して送信された場合は文字列 "ON" になります。それ以外の場合は "OFF" になります。

HTTPS_KEYSIZE

前述の CERT_KEYSIZE と同じです。

HTTPS_SECRETKEYSIZE

前述の CERT_SECRETKEYSIZE と同じです。

HTTPS_SERVER_ISSUER

前述の CERT_SERVER_ISSUER と同じです。

HTTPS_SERVER_SUBJECT

前述の CERT_SERVER_SUBJECT と同じです。

INSTANCE_ID

テキスト形式で指定される、現在の IIS インスタンスの ID。この要素が 1 になる場合、その値は文字列です。INSTANCE_ID は、この要求が属する Web サーバーのインスタンスの番号を表します。これが便利なのは、サーバーで複数のインスタンスの Web サーバーが実行されている場合のみです。それ以外の場合、この値は常に 1 になり、コンピュータの Web サーバーの最初かつ唯一のインスタンスを表します。

INSTANCE_META_PATH

クライアントの HTTP 要求の送信先となる IIS のインスタンスの メタベース。ServerVariables コレクションの APPL_MD_PATH 要素の項で既に説明したように、メタベースは、Web サーバーのインストールと構成に固有の情報を保持します。たとえば、Personal Web Server を使用しているコンピュータでは、この要素の値は /LM/W3SVC/1 のようになります。

LOCAL_ADDR

クライアントの HTTP 要求を受け入れる Web サーバーの TCP/IP アドレス。ServerVariables コレクションのこの要素が特に重要となるのは、Web サーバーが個別の IP アドレスを持ついくつかのコンピュータから成るサーバーファームにあり、すべてが同じドメイン名に対する要求に応答する場合です。localhost としてサーバーにアクセスした場合、この値は 127.0.0.1 になります。

LOGON_USER

セキュリティが基本設定または Windows NT チャレンジ/レスポンスに設定された場合の、システムにログオンしたユーザーの Windows NT ユーザーアカウント。匿名セキュリティの場合は、空の文字列を返します。

PATH_INFO

クライアントが HTTP 要求を行う Web ページの仮想パス。この情報が仮想ディレクトリである場合、その仮想ディレクトリは物理ディレクトリにマップされてから、CGI フィルタに送信されます。

PATH_TRANSLATED

ServerVariables コレクションの PATH_INFO 要素の値の、仮想から物理へのマッピング。

QUERY_STRING

HTTP 要求の URL の最後にある疑問符 (?) から後の、クライアントが送信する値。この要素には、HTTP の GET メソッドを使用して Web サーバーに送信される情報も含まれます。この要素のすべての情報は、 QueryString コレクションでも利用できます。このコレクションは解析を必要としないので、より簡単に利用できます。

REMOTE_ADDR

クライアントの TCP/IP アドレス。

REMOTE_HOST

Web サーバーがクライアントの HTTP 要求を受け取る IP アドレス。HTTP 要求にこの情報が含まれていない場合、REMOTE_ADDR 要素の値が設定され、この値は空になります。

REQUEST_METHOD

クライアントが HTTP 要求を行ったメソッド (GETPOSTHEAD など)。

SCRIPT_NAME

現在のスクリプトへの仮想パス全体。URL のベース部分は含まれません。ベース部分は ServerVariables コレクションの URL 要素によって表されます。自己参照 URL 用に (多くは内部的に) 使用されます。これは PATH_INFO 要素の値と等しくなります。

SERVER_NAME

自己参照 URL に指定される、Web サーバーの TCP/IP アドレス、その DNS、またはホスト名。

SERVER_PORT

クライアントの HTTP 要求の送信先となるサーバーポート。通常、ほとんどの Web サーバーでは 80 または 8080 です。

SERVER_PORT_SECURE

HTTP 要求が、保護されたポートで Web サーバーによって管理される場合、この値は 1 になります。ポートが保護されていない場合、この値は 0 になります。

SERVER_PROTOCOL

クライアント要求を処理するために Web サーバーによって使用されるプロトコルの名前とバージョン。たとえば、クライアントが Microsoft Internet Explorer 4.01 を使用していて、Web サーバーが IIS 4.0 である場合、この値は文字列 "HTTP/1.1" になります。

SERVER_SOFTWARE

クライアントの HTTP 要求を処理する Web サーバーソフトウェアの名前とバージョン。たとえば、Microsoft IIS 4.0 を使用している場合、ServerVariables コレクションのこの要素の値は、Microsoft-IIS/4.0 になります。

URL

HTTP 要求でクライアントが要求したベース URL。

 
<% 

' The following code determines the value of the 
' LOGON_USER item of the ServerVariables collection. This 
' code can be used to determine the identity of the 
' client. 
Dim strUserName

strUserName = Request.ServerVariables("LOGON_USER")

%>
 
メモ

前述のリストで示したように、ServerVariables コレクションには、クライアントの HTTP 要求に関して非常に便利な情報が多く含まれています。この最も重要な要素により、ユーザーの個人情報やアドレスを確認できる場合があります。これらの要素を使用すると、セキュリティ対策をカスタマイズできます。

また、Request オブジェクトの他のコレクションのデータの多くも、ServerVariables コレクションを通じて取得できます。ただし、より多くの労力が必要です。

 
BinaryRead  
MySafeArray=Request.BinaryRead(ByteCount)
 

BinaryRead メソッドは、HTTP の Post の一部としてクライアントが送信した HTTP 要求の本文から、バイト数を直接読み取ります。BinaryRead メソッドを使用して HTTP 要求から読み取ったデータは SafeArray に返されます。SafeArray は、そのアイテムを含むだけでなく、配列の次元数と上限値も含む特別なバリアント配列です。

実際には、SafeArray は配列ではありません。これは配列部分に情報を内部的に保持するために使用される、特別なタイプの構造です。次元値および上限値は、構造の要素として C/C++ からのみ利用できます。スクリプトを通じてこれらの値を操作することも取得することもできません。

パラメータ
MySafeArray

BinaryRead が返す情報を保存するために使用される SafeArray の名前。

ByteCount

BinaryRead メソッドを使用して読み取られるバイト数。通常、この変数の値は、前述した Request オブジェクトの TotalBytes プロパティを使用した場合に返されるバイト数になります。

 
<% 

' The following code determines the total number of bytes 
' sent in the client's HTTP request. It then reads the 
' bytes, checks for errors, and if there are none, 
' reports to the client that the read was successful.
Dim lngTotalByteCount
Dim vntRequestData

On Error Resume Next

lngTotalByteCount = Request.TotalBytes

vntRequestData = Request.BinaryRead(lngTotalByteCount)
If Err = 0 Then
   ' For details about the Response object, see Chapter 8.
   ' For now, suffice it to say the following code sends
   ' information to the client.
   Response.Clear
   Response.Write lngTotalByteCount & _
                  " bytes successfully read.<BR>"
   Response.End
End If 

%>
 
メモ

Web アプリケーションのクライアントが、HTTP 要求の本文で送信された情報を完全に制御できる場合、このメソッドは役立ちません。それは、クライアントがバイトレベルで情報をアップロード (またはファイルをアップロード) できるようにするためです。しかし、Post 要求で送信された情報をバイトレベルで管理するのは困難です。サードパーティからは、ファイル転送機能をより効率的かつ簡単にアプリケーションに追加できるようにするいくつかのファイル転送コントロールが提供されています。

Request オブジェクトの Form コレクションから既に情報を取得している場合、それ以降は BinaryRead メソッドを呼び出すとエラーになることに注意してください。同じように、既に Request オブジェクトの BinaryRead メソッドを呼び出していて、それ以降に Form コレクションから情報を取得しようとすると、スクリプトでエラーが発生します。