Response オブジェクト | |
Request オブジェクトを使用するとクライアントブラウザが HTTP 要求で送信した情報を取得して操作できるのと同じように、Response オブジェクトを使用するとクライアントへの HTTP 応答を広範囲に制御できます。この制御の主なカテゴリは次の 3 つです。
HTTP 応答ヘッダでの制御には、クライアントコンピュータへの Cookie の設定、HTTP ヘッダ値の既存のさまざまな値 (指定されたページのコンテンツタイプや有効期限情報など) の設定、および HTTP 応答へのカスタムヘッダの追加が含まれます。 HTTP 応答の本文は、Write および BinaryWrite メソッドを通じて直接制御します。名前から推測できるように、Response オブジェクトのこれらのメソッドを使用すると、応答の本文に直接情報を書き込むことができ、クライアントは HTTP 要求の応答で受け取る他の情報と同じように情報を受け取ることができます。 最後に、Response オブジェクトでは、クライアントにいつどのような方法で応答を送信するかを制御できます。たとえば、応答のバッファリングに関連するプロパティとメソッドを使用すると、HTTP 応答を 1 つの単位としてクライアントに送信するか、個別の要求ごとに結果を送信するかを指定できます。また、クライアントが Web サイトに接続されているかどうかを動的に調べることができます。クライアントの要求は、クライアントが別の要求を行ったかのようにリダイレクトできます。さらに、Response オブジェクトを使用して Web サーバーログにエントリを書き込むことができます。 |
Buffer | |
Response.Buffer[=blnSetting] | |
Buffer プロパティでは、スクリプトで作成されたコンテンツの全体をクライアントブラウザに送信するのか、各行が作成されて HTML ストリームに入力されるたびにすぐにクライアントブラウザに送信するのかを指定できます。True に設定した場合、ページのすべてのスクリプトは、そのスクリプトの結果がクライアントブラウザに送信される前に実行されます。 Buffer プロパティの初期設定値は、Windows Scripting Host スクリプトまたは Web サイトの Microsoft 管理コンソール (Microsoft Management Console) を通じてメタベースで ASPBufferingOn を設定しない限り、False になります。メタベースで値が設定された場合、その値はページで Buffer プロパティを使用して上書きできます。たとえば、ASPBufferingOn を True に設定した場合、後で Buffer プロパティを使用してこの動作を上書きし、IIS がページをバッファリングしないようにできます。 |
|
パラメータ | |
|
|
例 | |
次に例を示します。Response オブジェクトの Buffer プロパティを明示的に設定していないので、このプロパティは False です。 <%@ LANGUAGE="VBScript" %> <HTML> <% CODE THAT RETRIEVES A FIELD VALUE FROM A DATABASE %> 応答は要求元のブラウザに送信されるまでバッファリングされません。このため、前述のデータベースアクションでエラーが発生した場合は、途中でエラー通知で終わるページがユーザーに表示されます。続いて、2 番目のコード例を考えます。 <%@ LANGUAGE="VBScript" %> <%Response.Buffer = True %> <HTML> <% On Error Resume Next ' CODE THAT RETRIEVES A FIELD VALUE FROM A DATABASE If Err.Number <> 0 Then Response.Clear Response.Write "There has been an error. Here is the SQL" Response.Write "statement that caused the problem: " Response.Write strSQL Response.End End If %> この 2 番目の例では、最初に応答がバッファリングされて完了した後に、要求元のブラウザに送信されます。このため、バッファをクリアし、前述のバッファリングされない例よりも多くの情報を提供する、簡単なエラー通知を配置できます。このコードでは多くの操作を行いませんが、理解できるでしょう。 応答がバッファリングされない場合、結果がエラーになる場合であっても、クライアントは要求に対する HTTP 応答が作成されたときにその応答を受け取ります。 |
|
メモ | |
覚えておく必要がある最初の事項は、HTTP 応答に対して <HTML> タグを設定する前に、Buffer プロパティを設定する必要があるということです。<HTML> タグの後に Buffer プロパティを設定しようとすると、ランタイムエラーが発生します。 たとえば、ページの言語を設定する前処理ディレクティブが含まれている場合、このディレクティブは、Buffer プロパティの値を設定しようとする前に配置する必要があります。Buffer プロパティの値を設定した後にページの言語を設定しようとすると、エラーが発生します。 Buffer プロパティが True に設定され、スクリプトが Flush メソッドをいずれの場所でも呼び出さない場合、Web サーバーはクライアントが送信した Keep-Alive 要求を使用します。ブラウザからの Keep-Alive 要求は、クライアントとの接続を維持するようにサーバーに伝えます。クライアントの Keep-Alive 要求がサーバーで使用された場合、HTTP 要求を行うたびに接続の再確立は強制されません。実際には、既に接続が行われています。このために、クライアントはもう一度 URL を解決しなくても済みます。 Buffer プロパティが False に設定されているか、スクリプトのどこかで Flush メソッドを使用する場合、サーバーは各要求に応じてクライアントへの新しい接続を作成することが強制されます。 スクリプトはいつバッファリングを行うのでしょうか。この質問の答えは、次の 2 つの要素に基づいて決まります。つまり、クライアントにとって長すぎる待機時間はどれくらいなのか、およびスクリプトがどれくらい複雑なのかということです。 クライアントがインターネットの初歩的レベルユーザーである場合、通常、ユーザーが許容できる待機時間は短くなります。こうしたクライアントの場合は、フォームで [Submit] ボタンをクリックしてからすぐにアクションが発生する必要があります。経験のあるユーザーは、インターネットアプリケーションのバックエンドに関する理解があり、スクリプトの結果で遅延が発生しても寛容的であると考えられます。 さらに重要なのは、応答を 1 つの単位として提供することがどれだけ重要かということです。多くの反復処理を行い、各ループが前のループによって直接影響を受けるスクリプトでは、最終的な結果を 1 つの単位として提供することがより重要です。ただし、スクリプトがいくつかの定義可能セクションで構成される場合、各スクリプトは単独で簡単に表示できるので、バッファリングの重要性は減ることがあります。 1 つの単位で結果が求められる複雑なスクリプトでの遅延時間に対応する 1 つの方法は、 何らかのフォームで "お待ちください" ページを使用することです。この中間ページにより、要求が受け取られ、スクリプトが処理中であることをユーザーに伝えることができます。 たとえば、クライアントブラウザが、長い読み込み時間 (たとえば 30 秒) を必要とする非常に複雑なクエリーからデータを取得およびフォーマットする ASP スクリプトを要求するとします。クライアントがリンクをクリックしてから 30 秒間何も動きがないようにするのではなく、最初に次のようなページを表示させます。長い間何も動きがない場合、経験の浅い Web ユーザーは、同じリンクやボタンを繰り返しクリックする可能性があります。 <HTML> <HEAD><TITLE>Please Wait</TITLE></HEAD> <BODY LANGUAGE = "VBScript" OnLoad = "WinLoad( )"> Your request is being processed, please wait... <SCRIPT LANGUAGE = "VBScript"> Sub WinLoad( ) Parent.Location.HREF = "/Reports/Longreport.asp" End Sub </SCRIPT> </BODY> </HTML> この短いページの読み込みにはほとんど時間はかかりません。読み込みが完了すると、次のスクリプトが処理され、レポートが表示できるようになるまでに、"お待ちください" メッセージがユーザーに表示されます。レポートが表示できるようになると、"お待ちください" メッセージがアンロードされ、レポートが読み込まれます。 最後に、スクリプトの大部分でバッファリングが必要な場合は、仮想ディレクトリで [アプリケーションオプション構成] ページを使用して、メタベース ASPBufferingOn を設定し (付録 D を参照)、すべてのスクリプトがデフォルトでバッファリングされるようにすることを検討してください。 |
|
CacheControl | |
Response.CacheControl[=ProxyCacheControlSetting] | |
CacheControl を使用すると、ページに対応するプロキシサーバーがページをキャッシュできるかどうかを設定できます。ページのコンテンツが大きく、頻繁に変更されない場合は、プロキシサーバーによるページのキャッシュを許可し、より高速に要求元のクライアントブラウザに対応することを検討してください。 |
|
パラメータ | |
|
|
例 | |
次のコードに示すように、このプロパティを設定するのは簡単です。ここで、クライアントがプロキシサーバー経由で Web ページにアクセスしているかどうかを確認する方法がないかを考えるときがあります。使用される可能性のあるプロキシサーバーの存在を事前に認識している場合、その方法は存在しますが、問題を含んでいるので処理が煩雑になります。さらに、このプロパティを設定する前には、このことを確認する必要がありません。クライアント要求がプロキシサーバーによって処理されてこのプロパティがページのキャッシュに影響するか、またはこのプロパティは完全に無視されます。 <% ' The following code sets the HTTP cache control header so ' that this page can be cached by the proxy servers being ' used to access the page. Response.CacheControl = "Public" %> <HTML> <% ' Note that the CacheControl property was set BEFORE the ' <HTML> tag was constructed. %> |
|
メモ | |
プロキシサーバーがページをキャッシュできる場合、プロキシサーバーを通じてそのページにクライアントがアクセスするまでの時間は明らかに短くなります。ただし、ページが頻繁に変更される場合、この方法の利便性は低下します。また、CacheControl プロパティの値を Public に設定しただけでは、ページのキャッシュにプロキシサーバーは必要ありません。これはプロキシサーバーで設定する必要があります。 CacheControl の値を設定すると、要求時にクライアントに送信される HTTP ヘッダのキャッシュ制御の値が変わります。 このプロパティを使用する必要がある場合は、クライアントに応答を送信する前 (ページの <HTML> タグが生成される前) に使用する必要があります。<HTML> タグが既にクライアントに送信されてからこのプロパティまたは他の HTTP ヘッダの値を設定しようとすると、応答がバッファリングされない限り、エラーが発生します。 このプロパティを設定しても、プロキシサーバーでキャッシュが行われるとは限りません。このプロパティが有効になるためには、プロキシサーバーそのものが、これらのページをキャッシュするように設定される必要があります。 |
|
Charset | |
Response.Charset(strCharsetName) | |
Charset を使用すると、HTTP 応答コンテンツの文字セットを指定できます。この文字セットの名前は、HTTP 応答ヘッダ内で Content-Type の "ヘッダ/値" のペアの最後に追加されます。 |
|
パラメータ | |
|
|
例 | |
Charset プロパティを設定しない場合、Content-Type HTTP 応答ヘッダは次のようになります。 content-type:text/html 次のコード行のように Charset プロパティを設定するとします。 <% Response.Charset("ISO-LATIN-7") %> Charset プロパティ値の設定に使用する値 (前述のコードでは文字列 "ISO-LATIN-7") は、Content-Type HTTP 応答ヘッダ値の最後に追加されます。 content-type:text/html;charset=ISO-LATIN-7 |
|
メモ | |
Charset は本マニュアルおよび Microsoft のマニュアルの両方でプロパティとして説明されていますが、実際には、文字列パラメータを受け取るメソッドであり、Content-Type HTTP 応答ヘッダの最後に追加される文字セットの名前を表します。このため、Response オブジェクトの他のプロパティのように Charset "プロパティ" の値を設定しようとすると、次のようなエラーが発生します。 <% ' Next line will NOT work: Response.Charset = "ISO-LATIN-7" %> Charset プロパティに対して設定する値が有効な文字セットを表さない場合、この値はクライアントブラウザによって無視され、代わりにデフォルトの文字セットが使用されます。 Content-Type の "ヘッダ/値" のペアの最後には、1 つの文字セットの名前のみを追加できます。それ以降は、Charset プロパティの値を変更するたびに最後の設定が置き換えられます。そのコード例を次に示します。 <% Response.Charset("ISO-LATIN-7") Response.Charset("ISO-LATIN-3") %> このコードでは、次の Content-Type HTTP 応答の "ヘッダ/値" のペアが生成されます。 content-type:text/html;charset=ISO-LATIN-3 コンテンツタイプが完全にテキスト以外 (イメージデータなど) の場合も、文字セット値はブラウザによって無視されます。 最後に、Apple Macintosh と互換機のデフォルトの文字セットは、IBM PC と互換機とは異なり、ISO-LATIN-1 ではありません。Charset プロパティを設定しない場合、すべての Macintosh ブラウザは、要求されたページで Macintosh 文字セットが使用されていると解釈します。Microsoft の Personal Web Server for Macintosh では、要求されたコンテンツの文字セットが自動的に ISO-LATIN-1 に設定され、スクリプトで定義する他の Charset プロパティ設定は無視されます。 HTTP 応答ヘッダ値の変更となる他のプロパティと同じように、応答がバッファリングされる場合を除き、サーバーが <HTML> タグをクライアントに送信する前に Charset プロパティを設定する必要があります。 |
|
ContentType | |||||||||||||||||||||||||
Response.ContentType[=strContentType] | |||||||||||||||||||||||||
ContentType を使用すると、HTTP 応答ヘッダで Content-Type 設定を指定できます。この値により、Response の本文で送信されるデータタイプが定義されます。クライアントブラウザはこの情報を使用して、ダウンロードされた HTTP 応答コンテンツの解釈方法を判断します。 |
|||||||||||||||||||||||||
パラメータ | |||||||||||||||||||||||||
|
|||||||||||||||||||||||||
例 | |||||||||||||||||||||||||
<% ' The following code sets the value of the Content-Type ' HTTP response header according to the value of a ' local variable. If strData = "jpg" Then Response.ContentType = "image/JPEG" Else Response.ContentType = "text/plain" End If %> |
|||||||||||||||||||||||||
メモ | |||||||||||||||||||||||||
ContentType の "タイプ/サブタイプ" のペアで使用できる値の一部を、表 8.1 に示します。
サブタイプの数は、時間の経過と共に著しく増加すると想定されます。利用できるサブタイプの最適な参照先は、最新の MIME RFC (本マニュアル作成時点では RFC 2231) です。多くの新しいサブタイプが各社によって作成される見込みです。たとえば、Microsoft は Channel Definition Format のアプリケーションタイプとして既に x-cdf サブタイプを追加しています。 HTTP 応答ヘッダ値の変更となる他のプロパティと同じように、応答がバッファリングされる場合を除き、サーバーが <HTML> タグをクライアントに送信する前に ContentType プロパティを設定する必要があります。 ContentType プロパティの別の例については、本章で後述する、Response オブジェクトの BinaryWrite メソッドのサンプルコードを参照してください。 |
|||||||||||||||||||||||||
Expires | |
Response.Expires[=intNumMinutes] | |
Expires プロパティは、クライアントコンピュータが現在のページをキャッシュする時間を分単位で指定します。Expires プロパティで指定された時間内にユーザーがページに戻った場合、ページのキャッシュされたバージョンがユーザーに表示されます。Expires プロパティを設定しない場合は、Microsoft Management Console の仮想ディレクトリの [プロパティ] ページを通じて仮想ディレクトリに設定された、コンテンツの有効期限が使用されます。有効期限の初期設定値は 24 時間です。 |
|
パラメータ | |
|
|
メモ | |
クライアントブラウザがページをキャッシュしないようにするには、intNumMinutes の値を使用します。これにより、クライアントはページに移動するたびに Web サーバーからページを再要求するようになります。 スクリプトで Expires プロパティを複数設定しようとすると、最も短い設定が使用されます。たとえば、次のスクリプトを含むページの場合、Expires プロパティの最後の設定が 20 分であるにもかかわらず、クライアントでページがキャッシュされるのは 5 分になります。 <% Response.Expires = 10 Response.Expires = 5 Response.Expires = 20 %> HTTP 応答ヘッダ値の変更となる他のプロパティと同じように、応答がバッファリングされる場合を除き、サーバーが <HTML> タグをクライアントに送信する前に Expires プロパティを設定する必要があります。 |
|
ExpiresAbsolute | |
Response.ExpiresAbsolute[=[ Date ] [ Time ] ] | |
現在のページのコンテンツのキャッシュがクライアントコンピュータで中止される日時を示します。ExpiresAbsolute プロパティを設定するときに時間を指定しない場合、時間は指定した日の真夜中になります。ExpiresAbsolute プロパティで指定された日より前にユーザーが現在のページに移動した場合、クライアントはそのページのキャッシュバージョンを表示します。 |
|
パラメータ | |
|
|
例 | |
<% ' The following code sets the current page's caching on the ' client machine to end at 9 P.M. on 7 May 1998 GMT. NOTE ' the use of the "#" to designate the date and time. Response.ExpiresAbsolute=#May 7, 1998 21:00:00# %> |
|
メモ | |
例に示すように、ExpiresAbsolute プロパティの値で日時を指定するには、シャープ記号 (#) を使用する必要があります。 Expires プロパティと同じように、このプロパティを複数設定すると、現在のページのキャッシュはスクリプトで指定した最も早い日時に終了します。 HTTP 応答ヘッダ値の変更となる他のプロパティと同じように、応答がバッファリングされる場合を除き、サーバーが <HTML> タグをクライアントに送信する前に ExpiresAbsolute プロパティを設定する必要があります。 |
|
IsClientConnected | |
Response.IsClientConnected | |
Response オブジェクトの Write メソッドを最後に使用した後に、まだクライアントが Web サーバーに接続されている場合は True になり、それ以外の場合は False になる読み取り専用プロパティ。 |
|
パラメータ | |
なし |
|
例 | |
<% ' The following code determines whether the client ' is still connected to the server. If it is still ' connected, then the SessionID (see Chapter 10) will be ' used to retrieve the user information from a database. If Response.IsClientConnected Then strUserName = fn_strGetUserName(Session.SessionId) End If %> |
|
メモ | |
IsClientConnected プロパティを使用すると、クライアントが切断されているかどうかを調べることができます。これは現在のスクリプトが長い場合に非常に重要です。クライアントが既に切断されている場合は、スクリプトの処理を続行しないことが重要です。 次の例では、長いスクリプトで処理を続行する前にクライアント接続をチェックする方法を示します。クライアントが既に切断されている場合、すべての処理を中止する最も簡単な方法は、Response オブジェクトの End メソッドを使用することです。 <%Response.Buffer = True%> <HTML> <HEAD><TITLE>One Long Script</TITLE></HEAD> <BODY> <% ' The following code is the first of two segments ' in this script that will take a long time to process: [SOME LONG CODE] ' Now before performing the second half of this long script, ' check to see if the client is still connected. If Response.IsClientConnected Then [SECOND LONG CODE SEGMENT] Else ' The client is no longer connected, end the script's ' processing. Response.End End If %> </BODY></HTML> このプロパティが便利なのは、HTTP 1.1 を使用するクライアントが対象である場合のみです。ブラウザが HTTP 1.0 を使用している場合、IIS は HTTP の新しいバージョン (1.1+) のみと一貫性がある永続的な接続ではなく、クライアントの個別の HTTP 要求および Keep-Alive 要求を使用するセッションを追跡します。 IsClientConnected を使用する ASP ファイルが IIS 4.0 上で実行されている場合、ファイルがコンテンツをクライアントに送信する場合のみ、プロパティの値が正確になります。つまり、サーバーサイドコードのみを含むファイルの場合は、IsClientConnected の結果値は正確にはなりません。ただし、IIS 5.0 では、現在のファイルがクライアントにコンテンツを送信するかどうかにかかわらず、IsClientConnected は動作します。 |
|
PICS | |
Response.PICS(strPICSLabel) | |
PICS (Platform for Internet Content Selection) ラベルを HTTP 応答ヘッダに追加します。この PICS システムは、Web コンテンツにラベルを付け、Recreational Software Advisory Council (RSAC) やその親組織の SafeSurf などの格付けサービスが、NetNanny や CyberWatch などのコンテンツ制御ソフトウェアによって設定されたさまざまな基準に従ってそのコンテンツを格付けできるようにします。 |
|
パラメータ | |
|
|
例 | |
<% ' The following piece of code sets a PICS label for the ' content of this page corresponding to the rating discussed ' earlier. Dim strPicsLabel strPicsLabel = _ "(PICS-1.1 <HTTP://www.rsac.org/ratingsv01.html> " strPicsLabel = strPicsLabel & "labels on " & Chr(34) strPicsLabel = strPicsLabel & "2000.07.20T06:00-0000" & _ Chr(34) strPicsLabel = strPicsLabel & " until " & Chr(34) strPicsLabel = strPicsLabel & "2000.12.31T23:59-0000" & _ Chr(34) strPicsLabel = strPicsLabel & "ratings (V 0 S 1 L 3 N 0))" Response.PICS(strPicsLabel) %> |
|
メモ | |
例の PICS ラベルでは次のことが示されています。
HTTP 応答ヘッダに追加される実際の PICS ラベルは次のとおりです。 PICS-label:(PICS-1.1 http://www.rsac.org/ratingsv01.html labels on "1998.03.20T06:00-0000" until "1999.12.31T023:59-0000" ratings (v 0 s 1 l 3 n 0)) HTTP ヘッダに無効な PICS ラベルを追加しようとすると、クライアントコンピュータはそれを無視します。それ以降は、PICS プロパティ値を設定するたびに最後の値が上書きされます。最後の設定のみが実際にクライアントコンピュータに送信されます。 PICS ラベルの日は引用符で囲みます。このため、Chr(34) 文字 (34 は引用符に相当する ASCII 文字) を使用する必要があります。これを最も簡単に処理するには、最後の PICS ラベルに指定されるとおりにラベルを入力し、コード行の各引用符を次の文字で置き換えます。 " & Chr(34) & " HTTP 応答ヘッダの値が変更される他のプロパティと同じように、PICS ラベルの追加は、応答がバッファリングされない限り、サーバーが <HTML> タグをクライアントに送信する前に行う必要があります。 |
|
Status | |
Response.Status(strStatusDescSetting) | |
Web サーバーからクライアントコンピュータに返される HTTP ステータス行を指定します。 |
|
パラメータ | |
|
|
例 | |
<% ' The following code sets the Status property of the ' Response object to 404 Not Found. Unless other content is ' generated for the page, the status code will be ' interpreted by itself by the client. strStatusText = _ "404 Not Found The Web server cannot find the " strStatusText = strStatusText & "file or script you asked " strStatusText = strStatusText & "for. Please check the URL " strStatusText = strStatusText & "to ensure that the path " strStatusText = strStatusText & "is correct." Response.Status = strStatusText %> |
|
メモ | |
他の Response ヘッダの設定と同じように、それ以降は、Status プロパティを設定するたびに最後の設定がリセットされます。 HTTP 応答ヘッダ値の変更となる他のプロパティと同じように、応答がバッファリングされる場合を除き、サーバーが <HTML> タグをクライアントに送信する前に Status プロパティを設定する必要があります。 |
|
Cookies | |
strKeyName = Response.Cookies.Key(3) strKeyValue = Response.Cookies.Item(strKeyName) | |
Response オブジェクトの Cookies コレクションを使用すると、ASP アプリケーションで Set-Cookie HTTP 応答ヘッダを使用して、Cookie をクライアントのコンピュータに書き込むことができます。存在しない Cookie の値を設定しようとすると、その値が作成されます。既に Cookie が存在する場合、設定する新しい値は、クライアントコンピュータに書き込まれた古い値を上書きします。 Request オブジェクトの Cookies コレクションと同じように、Response オブジェクトの Cookies コレクションの各 Cookie も Cookie 辞書を表すことができます。第 7 章に記載されているように、Cookie 辞書は、配列の各要素が名前で識別可能な点において、連想配列に似た構造です。Cookie 辞書の詳細については、第 7 章で Request オブジェクトの Cookies コレクションの項を参照してください。 Response オブジェクトの Cookies コレクションには、他の ASP コレクション同じように、次のプロパティがあります。
他の ASP コレクションと同じように、Item プロパティを使用することにより、Cookies コレクションの任意のフィールドの値を取得できます。ただし、本マニュアルの他の部分と同じように、以下の例では構文が短縮されているので、Item プロパティの使用を明示的に示しているわけではありません。次に例を示します。 Response.Cookies("UserPref") = "Red" このコードは、次のコードの短縮形式です。 Response.Cookies.Item("UserPref") = "Red" Cookie の値を設定するには、次のようなコードを使用します。 Response.Cookies("LastSearch") = _ "SELECT * FROM Details WHERE Color = 'Red'" コレクションの Item プロパティ、Key プロパティ、および Count プロパティの詳細については、第 4 章の 4.2 項を参照してください。 前述のコードの場合、既に存在しないときは Cookie UserPref を作成します。存在するときは元の値を上書きします。この Cookie は、クライアントブラウザに送信される応答に追加される SET-COOKIE 応答ヘッダに変換されます。クライアントブラウザはこの応答ヘッダを受信し、ユーザーのコンピュータに UserPref Cookie を作成 (または上書き) します。 Cookies コレクションの各要素 (Cookie が Cookie 辞書の場合はサブキー) には、次の Cookie 固有の属性があります。
|
|
例 | |
次に示すのは、Response オブジェクトの Cookies コレクションの使用に関する、より完全な例です。このコードは、前述した多くの項目を示しています。 <HTML> <HEAD><TITLE>Search Cookie Example</TITLE></HEAD> <BODY> <H3>Welcome to the Search Results Options Page.</H3> You can use the following form to select your search results display options. These options will be saved on your machine as a set of cookies. <FORM ACTION="/SaveSearchCookie.asp" METHOD = POST> First Name:<INPUT TYPE = TEXT NAME = "txtFirstName"><BR> Last Name:<INPUT TYPE = TEXT NAME = "txtLastName"><BR> User ID:<INPUT TYPE = TEXT NAME = "txtUserId"><BR> Check All that Apply: Show Descriptions: <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs"VALUE = "Desc"> Show Hit Count (display how many matches found per result): <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs"VALUE = "Count"> Show Relevance with Graph: <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs" VALUE = "Graph"> Use Small Fonts(will show more results per page): <INPUT TYPE = CHECKBOX NAME = "chkUserPrefs" VALUE = "Small"> <INPUT TYPE = SUBMIT VALUE = "Save Selections"> </FORM> </BODY> </HTML> 次のコード ( <% ' The following code retrieves user information from the ' Form collection of the Request object (see Chapter 7) and ' then writes the information to a set of cookies on the ' client machine. Dim strFirstName Dim strLastName Dim strUserId Dim intCounter Dim intPrefCounter Dim strKeyName Dim arstrUserPrefs( ) ' Retrieve user information... strFirstName = Request.Form("txtFirstName") strLastName = Request.Form("txtLastName") strUserId = Request.Form("txtUserId") intPrefCounter = 1 For intCounter = 1 to Request.Form("chkUserPrefs").Count ReDim Preserve arstrUserPrefs(intPrefCounter) arstrUserPrefs(intPrefCounter - 1) = _ Request.Form("chkUserPrefs")(intCounter) intPrefCounter = intPrefCounter + 1 Next ' Write the user information to the client machine. ' Save all the information in cookies, but set the ' Expires property only for the UserId. We'll want ' that to remain on the client machine after the session ' is complete. Response.Cookies("UserFirstName") = strFirstName Response.Cookies("UserLastName") = strLastName For intCounter = 1 to intPrefCounter - 1 strKeyName = "Pref" & CStr(intCounter) Response.Cookies("UserPrefs")(strKeyName) = _ arstrUserPrefs(intCounter - 1) Next ' Note in the first line below, that when no property ' is specified, the value of the cookie is set. Response.Cookies("UserId") = strUserId Response.Cookies("UserId").Expires = #December 31, 1999# Response.Cookies("UserId").Domain = "www.customsearch.com" Response.Cookies("UserId").Path = "/usersearch/" Response.Cookies("UserId").Secure = True %> |
|
メモ | |
この例では、UserFirstName Cookie がクライアントコンピュータに送信されます。ここで、strFirstName 変数の値は文字列 "David" であるとします。クライアントコンピュータに送信される実際の HTTP 応答ヘッダは次のとおりです。 Set-Cookie:USERFIRSTNAME=david この例で送信される 3 つの値は、800 (クライアントブラウザの幅)、8 (ビット単位の色深度)、および English (英語の設定) とします。クライアントに送信される実際の HTTP 応答ヘッダは次のとおりです。 Set-Cookie:USERPREFS=PREF1=800&PREF2=8&PREF3=english Cookie の値として送信される文字列値にスペースが含まれている場合、そのスペースは HTTP 応答ヘッダでプラス記号 (+) に置き換えられます。 次のように、SubKey を指定せずに、クライアントコンピュータの UserPrefs Cookie に後続の Cookie 値を送信するとします。 Response.Cookies("UserPrefs") = "german" PREF1 および PREF2 の 2 つの値が上書きされ、UserPrefs Cookie の Count プロパティは 1 を返します。 または、後続の Cookie 値を送信し、Cookie に値はあるがキーはないクライアントコンピュータに対して SubKey を指定すると、クライアントコンピュータに既にある値が上書きされます。 Response オブジェクトの Cookies コレクションの値を生成中に、指定された Cookie に定義されたサブキーが既にあるかどうかを調べる必要がある場合は、その Cookie の HasKeys プロパティを評価します。Cookie にサブキーが定義されている場合、HasKeys プロパティは True になります。 HTTP 応答ヘッダ値の変更となる他のプロパティと同じように、応答がバッファリングされる場合を除き、サーバーが <HTML> タグをクライアントに送信する前に Cookies コレクションの値を設定する必要があります。 |
|
AddHeader | |
ClientCustomHeader:CustomHeaderValue | |
対応する値を持つ独自の HTTP 応答ヘッダを追加できるようにします。以前に追加されたヘッダと同じ名前の HTTP ヘッダを追加する場合、2 番目のヘッダは最初のヘッダに追加されて送信されます。2 番目のヘッダを追加しても、同じ名前の最初のヘッダの値は上書きされません。ヘッダは、いったん HTTP 応答に追加されると削除できません。 第 7 章の ServerVariables コレクションの項に示されているもの以外の HTTP ヘッダをクライアントが Web サーバーに送信する場合は、HTTP_HeaderName を使用してそのヘッダを取得できます。たとえば、クライアントが次の HTTP ヘッダを送信するとします。 ClientCustomHeader:CustomHeaderValue この場合は、次の構文を使用してこの要素の値を取得できます。 <% Request.ServerVariables("HTTP_ClientCustomHeader") %> これは高度なメソッドです。慎重に計画して使用してください。Response オブジェクトの他のメソッドで目的がかなう場合は、AddHeader メソッドの代わりにそのメソッドを使用してください。 |
|
パラメータ | |
|
|
例 | |
<% ' The following code adds the CUSTOM-ERROR HTML header to ' the HTTP response headers. Response.AddHeader "CUSTOM-ERROR", "Your browser is not IE." %> |
|
メモ | |
HTTP 応答ヘッダを変更する Response オブジェクトの他のメソッドとプロパティのように、<HTML> タグをクライアントに送信する前に、AddHeader メソッドを呼び出す必要があります。Response オブジェクトの Buffer プロパティ値を以前に True に設定している場合は、Flush メソッドをそれまでに呼び出したことがない限り、AddHeader を使用できます。<HTML> タグをクライアントに送信した後、または Flush メソッドを呼び出した後に AddHeader を呼び出す場合、AddHeader を呼び出すとランタイムエラーが発生します。 カスタムヘッダではアンダースコアを使用しないでください。使用すると、既に存在するヘッダとの曖昧さが増します。複数の単語を区切るには、代わりにハイフンを使用します。ハイフンが含まれたカスタムヘッダの値を取得するには、カスタムヘッダの値を取得するときに、ハイフンをアンダースコアに置き換えます。 |
|
AppendToLog | |
Response.AppendToLog strLogEntry | |
現在のクライアント要求の Web サーバーログエントリに文字列を追加します。一度に追加できるのは最大 80 文字のみですが、AppendToLog メソッドは複数回呼び出すことができます。 |
|
Web サイトでの操作のログ | |
IIS では、ユーザーの操作をテキストファイルまたは ODBC 互換データベースに記録できます。IIS のログは Windows NT のログとは異なり、Windows NT イベントビューアツールを使用してレコードを表示することはできません。IIS ログファイルを表示するには、他の ASCII テキストファイルの場合と同じように開き、スプレッドシートまたはデータベースプログラムにインポートします。ODBC データベースにログを記録したときは、そのデータベースへのクエリーを通じてログを表示できます。 IIS のログファイルは、 具体的には、Web サイトでのユーザー操作に関する次の情報を記録できます。
この情報、およびアプリケーションが Response.AppendToLog を通じてこのログに追加する情報を使用して、サイトの将来の開発、セキュリティ、および新しいサーバーについて (負荷が高い場合) 計画できます。 |
|
パラメータ | |
|
|
例 | |
<% ' Assume you have constructed one string containing all that ' you'd like logged to the web's server. This string is ' declared as strOrigLogContent. The following Do...While ' loop code will loop through your content and log it to the ' web server 79 characters at a time. Do While Len(strOrigLogContent) > 0 If Len(strOrigLogContent) >= 79 Then strLogString = Left(strOrigLogContent, 79) Else strLogString = strOrigLogContent End If ' Log the content. Response.AppendToLog strLogString If Len(strOrigLogContent) > Len(strLogString) Then strOrigLogContent = _ Right(strOrigLogContent, _ Len(strOrigLogContent) - Len(strLogString)) Else strOrigLogContent = " End If Loop %> |
|
メモ | |
IIS の Web サーバーログに情報を追加できるようにするには、ログファイルを使用して操作を記録する Web サイトに対して、[拡張ログプロパティ] シートの [URI クエリ] オプションを有効にする必要があります。 このメソッドは、Web サイトでの操作に関する詳細情報を維持する上で、時間の節約に非常に役立ちます。エントリ (IP アドレスを含みます。Windows NT アカウント名、訪問日時を含むこともあります) と共にログファイルに保存する各ユーザーに固有の識別子がある場合、サイトで予期しないエラーが発生した時間にサイトに訪問していたユーザーをすぐに調べることができます。このメソッドは、ユーザーについて 100% 確認することはできないので、セキュリティ上は信頼することができませんが、有用なメソッドです。 |
|
BinaryWrite | |
Request.BinaryWrite arbyteData | |
文字変換を行わずに、応答コンテンツに情報を直接書き込みます。アプリケーションでクライアントにバイナリデータを書き込む場合、このメソッドを使用して、送信するデータが元のバイナリから文字データに変換されないようにする必要があります。 |
|
パラメータ | |
|
|
例 | |
次のサンプルコードは、BinaryWrite に対する単純な呼び出しとしては長いですが、特にデータベースからのバイナリデータを扱う必要がある場合に、非常に役立つ概念を示します。 <% ' The following code retrieves a binary object ' (in this case a JPG image) and writes it to the ' client using BinaryWrite. (For more information ' on ActiveX Data Objects usage, see Chapter 12.) ' Create an ADO connection object. Set adoCon = Server.CreateObject("ADODB.Connection") ' Use the Open method of the Connection object ' to open an ODBC connection with the database ' represented by the DSN ImageDatabase. adoCon.Open "ImageDatabase" ' Use the Execute method of the ADO Connection object ' to retrieve the binary data field from the database. Set adoRecImgData = adoCon.Execute _ ("SELECT ImageData FROM Images WHERE ImageId = 1234") ' Create a Field object by setting one equal to a ' specific field in the recordset created previously. Set adoFldImage = adoRecImgData("ImageData") ' Use the ActualSize property of Field object to retrieve ' the size of the data contained in the Field object. After ' this line you will know how many bytes of data reside in ' the Field object. lngFieldDataLength = adoFldImage.ActualSize ' Use the BinaryWrite method to write 4K bytes of binary ' data at a time. So, first we need to determine how many ' 4K blocks the data in the Field object represents. lngBlockCount = lngFieldDataLength / 4096 ' Now let's get how many bytes are left over after removing ' lngBlockCount number of bytes. lngRemainingData = lngFieldDataLength Mod 4096 ' We now must set the HTTP content type Response header ' so that the browser will recognize the data being sent ' as being JPEG image data. Response.ContentType = "image/JPEG" ' Loop through and write the first lngBlockCount number ' of binary blocks of data. For intCounter = 1 to lngBlockCount Response.BinaryWrite adoFldImage.GetChunk(4096) Next ' Now write the last remainder of the binary data. Response.BinaryWrite adoFldImage.GetChunk(lngRemainingData) ' Close the recordset. adoRecImgData.Close %> |
|
メモ | |
クライアントに送信する必要があるバイナリデータをデータベースに保存した状態になるまでは、BinaryWrite メソッドの使用には制限があるように思われますが、その後は BinaryWrite は非常に有用になります。コードサンプルが示すように、この 1 つの例は、バイナリデータの保存が可能な DBMS に保存されて、そこから取得されたイメージデータの表示です。 このメソッドを使用して、Microsoft SQL Server データベースに保存された JPEG イメージを表示すると (前述のようなコードを使用)、非常に快適に機能します。イメージへのリンク要求ではなく、イメージデータのみを含む HTTP 応答を送信するので、データベースアクセスがある程度高速であれば、単純なクライアント要求に応じてクライアントにイメージを送信するよりも高速になります。 |
|
Clear | |
Response.Clear | |
Response バッファの現在のコンテンツを空にします。その際には、バッファリングされた応答はクライアントに送信されません。 |
|
パラメータ | |
なし |
|
例 | |
<% Response.Buffer = True%> <HTML> <HEAD><TITLE>Response Clear Method Example</TITLE></HEAD> <BODY> <% On Error Resume Next [CODE TO DO SOME CALCULATIONS] lngFormulaElement1 = 47 lngFormulaElement2 = lngFormulaElement1 - 47 lngFormulaElement3 = 23 ' This next line results in a division-by-zero error ' (Error Number 11). lngNewCalcTotal = lngFormulaElement3 / lngFormulaElement2 ' This next line will still be processed because we used ' ON ERROR RESUME NEXT. If Err <> 0 Then ' The following code clears the Response buffer, writes ' an error message, and ends the response, forcing IIS to ' send the response to the client. Note that the Buffer ' property has to be set to True for the following code ' to work properly. Response.Clear Response.Write "Your request resulted in the error: " & _ Err.Description Response.Write " Error Number: " & Err.Number Response.Write "<BR>Call your web admin at 555-HELP for " Response.Write "more information." Response.End End If %> |
|
メモ | |
Response オブジェクトの Clear メソッドは、HTTP ヘッダをクリアせず、コンテンツのみをクリアします。例で示すように、Response オブジェクトの Buffer プロパティは True に設定する必要があります。それ以外の場合、このメソッドを使用するとランタイムエラーが発生します。 Clear メソッドの最も重要な使用方法の 1 つとして、バッファをクリアし、クライアントブラウザに何か別なもの (多くの場合、この例のようなエラー情報) を送信することが挙げられます。 このようにエラーを捕捉し、エラー情報をクライアントに送信するためには、Buffer プロパティを True に設定するだけでなく、次のコード行を使用して、エラートラップが処理されるようにする必要があります。 On Error Resume Next |
|
End | |
Response.End | |
応答バッファでの情報のすべての保存を終了し、バッファの現在のコンテンツをすぐにクライアントに送信します。End メソッドの呼び出し後に存在するコードは処理されません。End メソッドの呼び出しまでにスクリプトによって予約されていたメモリ (スクリプトで以前に使用されていたデータベースオブジェクトなど) は解放されます。 |
|
パラメータ | |
なし |
|
例 | |
前述の Clear メソッドの例を参照してください。 |
|
メモ | |
Buffer プロパティが True に設定された場合、End メソッドを呼び出すと、Flush メソッドを呼び出したかのように Response バッファをフラッシュできます。次の項を参照してください。ただし、Flush メソッドの呼び出しとは異なり、End の呼び出し後のコードは Web サーバーによって処理されません。 |
|
Flush | |
Response.Flush | |
現在応答バッファにあるすべてのデータをすぐにクライアントに送信します。Response オブジェクトの Buffer プロパティが True に設定されていない限り、このメソッドではランタイムエラーが発生します。このメソッドを使用すると、応答のさまざまな部分を随意にクライアントに送信できます。 |
|
パラメータ | |
なし |
|
例 | |
<% Response.Buffer = True%> <HTML> <HEAD><TITLE>Response Flush Method Example</TITLE></HEAD> <BODY> <% ' Suppose for this example that this first part of the ' script retrieves some information from a database and ' that retrieval takes a long time, say 30 seconds. ' (Don't worry about the details of the ActiveX Data Object ' calls. They are covered later in the book and serve only ' as an example here of something that might take a long time.) Set adoCon = Server.CreateObject("ADODB.Connection") adoCon.Open MyDatabase Set adoRec = adoCon.Execute([BIG SQL STATEMENT]) ' Rather than continue to the second part of the script, in ' which a second slow SQL statement (say another 15 seconds) ' executes, first we'll use the Flush method to force the ' first part of the script results to the client. This way, ' the user can be looking at the results of the first query ' while waiting for the second. Response.Flush ' [Second LONG SQL statement.] Set adoRec2 = adoCon.Execute([BIG SQL STATEMENT]) %> </BODY></HTML> |
|
メモ | |
Response オブジェクトのバッファリング機能を使用すると、応答を部分的にクライアントに送信できます。たとえば、世界中の組織の説明に続いて、データベースの情報から派生したオフィスのリストを示すとします。組織の説明はテキストなので、それを準備してクライアントに送信するのにはほとんど時間はかかりません。2 番目の部分にはより多くの時間がかかります。最初に、Response オブジェクトの Flush メソッドを使用して組織の説明をクライアントに送信し、次に、リストが完了したらそれを送信します。この方法を使用しない場合、ページのダウンロードが遅いという印象をユーザーに与える可能性があります。 ただし、1 つ注意があります。Active Server Pages で Flush メソッドを使用すると、サーバーはそのページ用にクライアントが送信した Keep-Alive 要求を無視します。したがって、クライアントに送信される情報ごとに新しい接続が行われます。 |
|
Redirect | |
Response.Redirect strURL | |
クライアントの要求を別の URL にリダイレクトします。 |
|
パラメータ | |
|
|
例 | |
<% ' The following code determines whether the client has ' security clearance for a certain page. If not, it ' is redirected to another URL. [...Code to determine user's clearance for the current page...] If Not(strUserSecurity = "ADMIN" or strUserSecurity = "SUPERADMIN") Then Response.Redirect "/security/noclearance.asp?usrid=09563" End If %> |
|
メモ | |
Redirect メソッドを呼び出すときに使用する strURL の値は、絶対 URL と DNS とするか、仮想ディレクトリとファイル名とすることができます。要求されたページと同じフォルダにあるファイル名とすることもできます。 スクリプトで HTTP 応答の本文へのコンテンツを記述した場合、Redirect メソッドへの呼び出しを実行すると、そのコンテンツはスクリプトによって無視されます。 Redirect メソッドの呼び出しは、Status プロパティを "302 Object Moved" に設定し、Location HTTP ヘッダを使用してユーザーを新しい場所に送ることと概念的に同じです。 リダイレクトでは、一部の古い (HTTP 1.0) クライアントブラウザは、新しい URL が呼び出されたときに、誤って POST 要求を GET 要求に変更することがあります。クライアントが POST した情報に、GET メソッドで処理できるよりも多くのデータが含まれている場合、これは重要な考慮事項となります。HTTP 1.1 プロトコルをサポートする新しいブラウザでは、この問題が修正されていると考えられます。 ASP ファイルが IIS 5.0 上で実行されている場合は、Server メソッドの Execute または Transfer の使用を検討する必要があります。これらのメソッドでは、Redirect で必要となるクライアントとサーバー間の通信は行われません。 |
|
Write | |
Response.Write vntData | |
HTTP 応答の本文に情報を直接書き込みます。 |
|
パラメータ | |
|
|
例 | |
<% strDirCommand = "Dir /w" ' The following code writes an entire HTML table to the HTTP ' response body. Response.Write "<TABLE>" Response.Write "<TR>" Response.Write "<TD WIDTH = 50%\>" Response.Write "Command" Response.Write "</TD>" Response.Write "<TD WIDTH = 50%\>" Response.Write "Description" Response.Write "</TD>" Response.Write "</TR>" Response.Write "<TR>" Response.Write "<TD WIDTH = 50%\>" Response.Write Chr(34) & strDirCommand & Chr(34) Response.Write "</TD>" Response.Write "<TD WIDTH = 50%\>" Response.Write "This allows you to see a list of the " Response.Write "files in <BR> your current folder." Response.Write "</TD>" Response.Write "</TR>" Response.Write "</TABLE>" %> |
|
メモ | |
サンプルプログラムで示すように、Write メソッドを使用して、クライアントブラウザが標準 HTML であると解釈する応答の本文へのクライアントサイドスクリプト、および HTML を記述できます。 キャリッジリターン/ラインフィードまたは引用符を送信するには、次のコードに示すように ' Note: Chr(34) is a quotation mark. Chr(13) & Chr(10) is ' the equivalent of a carriage return, followed by a ' linefeed. Response.Write "Hamlet said, " & Chr(34) & _ "To be, or not to be." & Chr(34) & Chr(13) & Chr(10) 最後に、Write メソッドを使用して、サーバーサイドスクリプトの値をクライアントブラウザに送信できます。このメソッドを使用すると、<%=...%> 表記を使ってサーバーサイドコードとクライアントコードを行き来するよりも、コードが簡潔になることがあります。たとえば、次のコードは、<%=...%> および Response.Write メソッドの両方を使用して、strHighestPrice データの値を表示します。 <% Response.Write "The highest price is " & strHighestPrice Response.Write ".<BR>" ' The same line as the preceding using the other format: %> The highest price is <%=strhighestPrice%>.<BR> |
|