Response オブジェクト  

Request オブジェクトを使用するとクライアントブラウザが HTTP 要求で送信した情報を取得して操作できるのと同じように、Response オブジェクトを使用するとクライアントへの HTTP 応答を広範囲に制御できます。この制御の主なカテゴリは次の 3 つです。

    HTTP 応答のヘッダで、どのデータおよびデータタイプをクライアントに送信するかの制御

    HTTP 応答の本文で、どのデータおよびデータタイプをクライアントに送信するかの制御

    データをいつどのように送信するかの制御

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 プロパティを使用して上書きできます。たとえば、ASPBufferingOnTrue に設定した場合、後で Buffer プロパティを使用してこの動作を上書きし、IIS がページをバッファリングしないようにできます。

 
パラメータ
blnSetting

Web サーバーによるスクリプトの処理によって発生する HTTP 応答を、バッファリングしてからクライアントに送信するか、作成中にクライアントに送信するかを指定します。

True

すべての処理が完了するまで、または Response オブジェクトの Flush または End メソッドが呼び出されるまで、スクリプトのすべての結果をバッファリングするように Web サーバーに指示します。バッファリングが True に設定されている場合でも、End メソッドを呼び出すと、バッファのコンテンツがクライアントに送信され、スクリプトの処理でのそれ以降のすべての結果はクライアントに送信されません。

False

すべての処理が完了するまで待つのではなく、スクリプトの処理中に、クライアントに情報を送信するように Web サーバーに指示します。バッファリングが False に設定されている場合に、Response オブジェクトの Clear、End、または Flush メソッドを呼び出すと、ランタイムエラーが発生します。

 

次に例を示します。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 を使用すると、ページに対応するプロキシサーバーがページをキャッシュできるかどうかを設定できます。ページのコンテンツが大きく、頻繁に変更されない場合は、プロキシサーバーによるページのキャッシュを許可し、より高速に要求元のクライアントブラウザに対応することを検討してください。

 
パラメータ
ProxyCacheControlSetting

Web サイトのアクセスに使用するプロキシサーバーがページをキャッシュできるかどうかを指定します。このプロパティの初期設定値は Private であり、これはプロキシサーバーがページをキャッシュできないことを示します。この値が Public の場合、プロキシサーバーはページをキャッシュできます。Private および Public は文字列値です。

 

次のコードに示すように、このプロパティを設定するのは簡単です。ここで、クライアントがプロキシサーバー経由で 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 の "ヘッダ/値" のペアの最後に追加されます。

 
パラメータ
strCharsetName

strCharsetName は文字セットに対応する文字列です。文字セットの初期設定値は ISO-LATIN-1 です。

 

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 応答コンテンツの解釈方法を判断します。

 
パラメータ
strContentType

コンテンツタイプを表します。この文字列は "タイプ/サブタイプ" フォーマットです。値のタイプ部分は一般的なコンテンツカテゴリを表し、サブタイプ部分はコンテンツの特定のタイプを表します。

 
<% 

' 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 に示します。

利用可能な Content-Type HTTP ヘッダの値

タイプ

サブタイプ

説明

Text

Plain、RichText

テキスト形式の情報

Multipart

Mixed、Alternative、Parallel、Digest

独立データの複数部分で構成された、応答のデータ

Message

Partial、External-body

カプセル化されたメッセージ

イメージ

JPEG、GIF

イメージデータ

Audio

Basic

オーディオデータ

Video

MPEG

ビデオデータ

Application

ODA、PostScript、Active

通常は、未解釈のバイナリデータ、またはメールベースアプリケーションによって処理されるデータ

サブタイプの数は、時間の経過と共に著しく増加すると想定されます。利用できるサブタイプの最適な参照先は、最新の 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

クライアントブラウザが現在のページをキャッシュする時間数 (分単位)

 
メモ

クライアントブラウザがページをキャッシュしないようにするには、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 プロパティで指定された日より前にユーザーが現在のページに移動した場合、クライアントはそのページのキャッシュバージョンを表示します。

 
パラメータ
Date

現在のページがキャッシュされなくなる日。使用する日付値は、月/日/年のフォーマットである必要があります。ただし、Response ヘッダで送信される値は、RFC 1123 の日付フォーマットに準拠します。

Time

現在のページがユーザーのコンピュータでキャッシュされなくなる Date の正確な時刻を示します。日付を指定しない場合、クライアントブラウザでは現在の日の真夜中にページの有効期限が切れます。Web サーバーは、指定する時間を GMT に変換してから、このヘッダをクライアントに送信します。

 
<% 
' 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 などのコンテンツ制御ソフトウェアによって設定されたさまざまな基準に従ってそのコンテンツを格付けできるようにします。

 
パラメータ
strPICSLabel

追加する PICS ラベルのコンテンツ全体を含む文字列値。PICS ラベルは次の部分で構成されます。

    ラベルを作成した格付けサービスの URL。

    コンテンツそのものの格付けに関する情報を含む、PICS 定義およびその拡張可能な "属性/値" のペアのセット。これには、格付けが行われた日や、その有効期限などが含まれます。

    コンテンツに与えられた格付けを表す、格付けサービスによって指定された "属性/値" のペアのセット。たとえば、RSAC にはソフトウェアの格付け用として暴力、性的描写、言葉遣い、ヌードの 4 つの属性があります。これら 4 つの属性と対応する値は、(V 0 S 1 L 3 N 0) のようになります。

 
<% 
' 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 ラベルでは次のことが示されています。

    使用された PICS 草案は 1.1 です。

    格付けサービスは RSAC です。

    格付けサービスの URL は http://www.rsac.org/ratingsv01.html です。

    コンテンツラベルは 2000 年 7 月 20 日の 6 A.M. (GMT) に有効になります。

    コンテンツラベルは 2000 年 12 月 31 日の 11:59 P.M. (GMT) に有効期限が切れます。

    コンテンツラベルでは、暴力レベルは 0、静的描写レベルは 1、言葉遣いレベルは 3、ヌードレベルは 0 です。

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 ステータス行を指定します。

 
パラメータ
strStatusDescSetting

strStatusDescSetting は、HTTP 要求の状態およびステータスコードの短い説明を示す、3 桁のステータスコードを含む文字列値です。

strStatusDescSetting パラメータの使用可能な値は現在の HTTP 仕様に記載されており、次の高レベルカテゴリに分類されます。

HTTP 仕様の最新版は、http://www.w3c.org/protocols で参照できます。

1xx

100 の範囲は、情報のみの応答ステータスをクライアントに送信するために予約されています。

2xx

200 の範囲は、正常な応答ステータスをクライアントに送信するために予約されています。

3xx

300 の範囲は、クライアントのリダイレクト用に予約されています。このステータス範囲は、一時的または永続的に移動された要求ページに使用します。

4xx

400 の範囲は、クライアントエラー通知をクライアントに送信するために予約されています。たとえば、移動されたページや存在しないページに移動しようとすると、404 Not Found エラーステータスがブラウザに送信されます。

5xx

500 の範囲は、 サーバーエラー通知をクライアントに送信するために予約されています。たとえば、一時的なオーバーロードやサーバー保守のために要求を処理できないサーバー上のページに移動しようとすると、応答ステータス 503 Service Not Available が発生することがあります。

 
<% 
' 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 コレクション同じように、次のプロパティがあります。

Item

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

Key

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

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

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

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

strKeyValue = Response.Cookies.Item("COLOR_PREF")
Count

Cookies コレクションの Count プロパティは、コレクションの現在の Cookie 数を表します。

他の 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 固有の属性があります。

Domain

Cookie を設定し、Domain プロパティで設定されるドメインで、ページに Cookie の値のみをクライアントが送信できるようにします。Domain プロパティは書き込み専用です。たとえば、ドメイン "mycorp.com" を次の LastSearch Cookie に追加するとします。この場合、ページの要求時に、クライアントがこの Cookie の値を mycorp.com ドメインに送信します。

Response.Cookies("LastSearch").Domain = "mycorp.com"
Expires

Cookie の有効期限が切れ、クライアントコンピュータで破棄される日。たとえば、Cookie の有効期限が 2000 年 1 月 29 日に切れるとします。この場合、次のようなコードを使用できます。

Response.Cookies("LastSearch").Expires = #1/29/2000#

Expires プロパティの値を設定しない場合、Cookie はクライアントセッションの期間中、クライアントコンピュータに存在します。Expires プロパティに設定する日付値が現在の日付よりも前の日付の場合も、Cookie はクライアントセッションの期間中、クライアントコンピュータに存在します。Expires プロパティは書き込み専用です。

HasKeys

既に説明したように、Cookies コレクションの Cookie は Cookie 辞書を表すこともできます。特定の Cookie にサブキーがあるかどうかを調べるには、次のように、その Cookie の HasKeys プロパティを使用する必要があります。

blnHasKeys = Response.Cookies("Colors").HasKeys
If blnHasKeys Then
   strColor3 = Response.Cookies("Colors")("color3")
End If

HasKeys プロパティは読み取り専用です。

Path

Path プロパティは、クライアントブラウザが仮想パス内からページを要求するときに、クライアントブラウザによる Cookie の送信先となる仮想ディレクトリを表します。たとえば、クライアントがこの Cookie を /Apps/SearchApps 仮想ディレクトリのスクリプトのみに送信するようにする場合は、次のコードを使用します。

Response.Cookies("LastSearch").Path = "/Apps/SearchApps"

Cookie の Path 属性が設定されない場合、パスはデフォルトで現在の ASP アプリケーションのパスになります。Path プロパティは書き込み専用です。

Secure

Secure プロパティを使用すると、クライアントが SSL (Secure Sockets Layer) を使用している場合にのみ、クライアントが Cookie を送信するかどうかを指定できます。たとえば、Cookie に何らかの機密情報を保存し (これは賢明ではありませんが、そうする必要がある場合もあります)、ユーザーのブラウザで SSL を使用しているときに限り、この情報を送信するように設定します。この方法を使用すれば、機密の Cookie が読み取られる可能性を大幅に低減することができます。次の単純なコード行を使用します。

Response.Cookies("SensitiveCookie").Secure = True

Secure プロパティはブール値を受け取ります。Secure プロパティは書き込み専用です。

 

次に示すのは、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>

次のコード (SaveSearchCookie.ASP) は、前のフォームで選択された値を取得し、それらをユーザーのコンピュータに Cookie として保存します。

<% 
' 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 メソッドの代わりにそのメソッドを使用してください。

 
パラメータ
strName

応答ヘッダに追加する HTML ヘッダの名前

strValue

応答ヘッダに追加する新しいヘッダの初期値

 
<% 
' 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 のログファイルは、winnt\system32\LogFiles\W3svc1\ex[date].log にあります。IIS のデフォルトログのエントリには、時刻、呼び出し元の IP、呼び出し元のメソッド (GET/POST)、uri-stem (サーバーパスなし)、および結果のステータスが含まれます。

具体的には、Web サイトでのユーザー操作に関する次の情報を記録できます。

    参照の日時

    要求されたページ

    ユーザーの IP アドレス

    サーバーに接続していた時間

この情報、およびアプリケーションが Response.AppendToLog を通じてこのログに追加する情報を使用して、サイトの将来の開発、セキュリティ、および新しいサーバーについて (負荷が高い場合) 計画できます。

 
パラメータ
strLogEntry

Web サーバーで現在のクライアント要求のエントリに追加する文字列。この文字列の長さは最大 80 文字とすることができます。Web サーバーログエントリに追加する文字列にはコンマを含めることはできません。IIS Web ログエントリのフィールドはコンマ区切りであるからです。

 
<%
' 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
 

文字変換を行わずに、応答コンテンツに情報を直接書き込みます。アプリケーションでクライアントにバイナリデータを書き込む場合、このメソッドを使用して、送信するデータが元のバイナリから文字データに変換されないようにする必要があります。

 
パラメータ
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
%>
. . . [additional code]
 
メモ

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 にリダイレクトします。

 
パラメータ
strURL

クライアントのリダイレクト先となる新しい場所の URL (Universal Resource Locator) 文字列

 
<% 
' 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 応答の本文に情報を直接書き込みます。

 
パラメータ
vntData

クライアントブラウザが受け取る、HTML テキストストリームに挿入される情報。これには、テキスト、HTML タグ、クライアントサイドスクリプトなどが含まれます。ASP スクリプトそのもののデータ変数は、バリアント型です。この値には %> 文字シーケンスを含めることはできず、Web ブラウザはこれをアクティブサーバースクリプトの最後であると解釈します。スクリプトでこの文字シーケンスが必要な場合は、代わりにエスケープシーケンス %\> を使用します。

 
<% 
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 を記述できます。

キャリッジリターン/ラインフィードまたは引用符を送信するには、次のコードに示すように Chr 関数を使用します。

' 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>