Request オブジェクト | |
Request オブジェクトを使用すると、ユーザーの HTTP 要求のヘッダと本文にアクセスできます。ユーザーが行った決定への応答はこのオブジェクトによって可能になるので、これは理解することが最も重要な組み込み型の ASP オブジェクトです。Request オブジェクトを使用すると、Web ページを動的に作成し、ユーザーからの入力に基づいて、より意味のあるサーバーサイドアクション (データベースの更新など) を実行できます。 |
HTTP の動作 | |
Request オブジェクトの詳細については、後で説明します。まず最初に、HTTP プロトコルの基本について理解することが重要です。この基本を理解すれば、Request オブジェクトの使用が不可解なものから現実のものに変わります。心配は無用です。ここでの説明は、HTTP プロトコルの簡単な概要だけです。 HTTP :簡単な例 HTTP が "トランザクション" 型のプロトコルであることは既にご存知でしょう。ブラウザ (クライアント) はサーバーに要求を送ります。サーバーは、可能な場合はその要求に応じ、クライアントに応答を送信します。サーバーは、そのトランザクションについては何も記憶しません。ブラウザはそのトランザクションを記憶することも、記憶しないこともあります。 CGI アプリケーションによって作成された HTML ページ HELLOCGI.HTM Web ブラウザとサーバー間の相互作用を示すため、その簡単な例を検証します。図 7.1 は Netscape Navigator の画面です。ここには、ユーザーに名前の入力を要求する、非常に単純なフォーム ユーザーが 次の出力リストでの [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 セグメントについても同様です。 スパイプログラムによって作成された次の出力に示すように、サーバーはブラウザが送信したヘッダを受信し、その要求を処理します。 ソケットからのデータの受信には、 [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> ブラウザは、ユーザー名を入力するフォームを表示し、ユーザーが入力を行って [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 アプリケーション サーバーは、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 仕様では、PUT や DELETE など、数多くの要求のタイプの詳細が示されていますが、すべてのサーバーでサポートされて一般的に使用されるのは、 GET および POST の 2 つだけです。GET 要求は、通常はドキュメントなどの情報を "GET" し、それをクライアントに返すように要求します。要求に追加の情報が含まれている場合、それらの情報は URL のパラメータとして追加されます。一方、POST 要求は、URL に "POST" する情報をサーバーに提供します。通常、これは HTML フォームのコンテンツをサーバーに送信するか、バックエンド処理に必要な情報をサーバーに提供するために使用されます。この情報そのものは、要求の本文に含まれます。 ほとんどのサーバーは、POST メソッドまたは GET メソッドから受信したデータを内部的に処理できません。通常、サーバーにデータを送信する POST 要求や GET 要求は、アクセサリプログラムまたは DLL (CGI、ISAPI アプリケーションおよび ISAPI フィルタ) によって処理されます。POST および GET 要求は、いずれも任意のサイズと種類のデータを返すことができます。 Web サーバーにデータを送信するときに、GET と POST は同じように見えますが、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 最初の行は、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 <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 first_name=horatio&last_name=aubrey この HTTP 要求で送信された情報をアプリケーションで操作するには、Request オブジェクトの Form コレクションを使用する必要があります。 <% strFirstName = Request.Form("first_name") %> このコードは、strFirstName 変数を first_name パラメータで送信された値に初期化します。Form コレクションの詳細については、本章で後述します。 |
ASP の Request オブジェクト | |
ASP の Request オブジェクトのプロパティ、コレクション、メソッド、およびイベントを次のボックスに示します。 Request オブジェクトの概要
|
コメントおよびトラブルシューティング | |
前述した 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 メソッドを使用して要求の本文からデータを読み取る準備を行うときに重要です。 |
|
パラメータ | |
|
|
例 | |
この例では、ユーザーが次のフォームに応答したと想定します。 <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 コレクションと同じように、次のプロパティがあります。
他の ASP コレクションと同じように、Item プロパティを使用することにより、ClientCertificate コレクションの任意のフィールドの値を取得できます。Item はコレクションのデフォルトプロパティであるため、構文を短縮し、Item プロパティの使用を明示的に表示しないようにできます。次に例を示します。 strCertIssuer = Request.ClientCertificate("Issuer") このコードは、次のコードの短縮形式です。 strCertIssuer = Request.ClientCertificate.Item("Issuer") コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。 Key の値として利用できるものは事前定義されており、次のとおりです。
一部の Key 値に "サブキー" を追加して、Issuer または Subject キーリストから個別のサブフィールドを取得できます。たとえば、Issuer キーリストから元のサブキー値の国を取得する場合は、次のようにその値を取得します。 Request.ClientCertificate("IssuerC") Subject キーリストから locality サブキー値を取得する場合は、次の構文を使用してその値を取得します。 Request.ClientCertificate("SubjectL") サブキーの ASN.1 指定子を使用すると、ここに示さないものも含めて、Certificate キー文字列では特定のサブキーから値を取得できます。ASN.1 識別子は、IP アドレスのようにピリオドで区切った数値のリストですが、たとえば 3.56.7886.34 のように、255 までの数値に制限されません。 利用できるサブキーは次のとおりです。
|
|
例 | |
<% ' 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 のようなステートレスプロトコルでは、サーバーとクライアントの両方が、非常に多くの繰り返し処理を実行する必要があることが問題です。たとえば、真にステートレスなプロトコルを使用した場合、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 この構文は次のように構成されます。
ローカルコンピュータ上に Cookie が存在する URL にユーザーが移動した場合、ブラウザは次のフォーマットで Request ヘッダを送信します。 Cookie:Name1=Value1;Name2=Value2;...NameX=ValueX; ここで、各値の意味は次のとおりです。
例を使用してわかりやすく説明します。クライアントが 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 までの間、パスが 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 に送信されることもあります。 最後に、両方の条件セット (userid と usersel の両方の Cookie) が満たされると、次の Cookie ヘッダがユーザーのブラウザによって送信されます。 Cookie: userid=a.keyton.weissinger; usersel=aspbooks Cookie を広範囲に使用する予定の場合は、Cookie について知っておく必要がある詳細が他にもあります。詳細については、前述のリファレンスを参照してください。この簡単な概要に続き、ここでは Request オブジェクトの Cookies コレクションについて説明します。 Request オブジェクトの Cookies コレクションを使用すると、ASP アプリケーションではクライアントの HTTP 要求の本文から Cookie と Cookie 辞書アイテムの値を取得できます。 Cookies コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。
他の 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 という名前になり、サブキーは、color1、color2、. . . 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) %> SubKey: <%= strSubKey %><BR> 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.ASP に UserPref という名前の 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 か月のみ有効です。本マニュアルの作成時点での草案は このドキュメントまたは最新版からは、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 コレクションと同じように、次のプロパティがあります。
他の 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 サーバーに送信されます。 次のコードでは、 <% ' 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 つすべてのオプション (Joystick、GraphicsAccel、および 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")%>  <%= 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> 次のコード行を使用して、 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 コレクションと同じように、次のプロパティがあります。
他の 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 で使用する場合は、いくつかの特殊文字をエンコードする必要があります。
これらの文字は、サーバー側の Server オブジェクト、およびクライアント側のカスタムスクリプトの URLEncode メソッドと HTMLEncode メソッドを使用して自動的にエンコードできます。 |
|
ServerVariables | |
strKeyName = Request.ServerVariables.Key(3) strKeyValue = Request.ServerVariables.Item(strKeyName) | |
ServerVariables コレクションでは、クライアントによる Web サーバーに対する特定の HTTP 要求のコンテキストで、事前定義されたいくつかの環境変数が含まれます。 ServerVariables コレクションには、他の ASP コレクションと同じように、次のプロパティがあります。
他の 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 コレクションに存在する順ではなく、アルファベット順になっていることに注意が必要です。
|
|
例 | |
<% ' 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++ からのみ利用できます。スクリプトを通じてこれらの値を操作することも取得することもできません。 |
|
パラメータ | |
|
|
例 | |
<% ' 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 コレクションから情報を取得しようとすると、スクリプトでエラーが発生します。 |
|