この記事ではWindows Server 2012 R2 IIS8.5の環境で動作確認をしています。
ASP自体は古い技術なため今動いている環境なら問題なく動くと思います。
差し替える際の注意点としては全てのメソッド、プロパティを実装し、ドキュメント化されてないメソッド等も実装しないとエラーになってしまう可能性があります。(使わなければエラーになりませんが)
実装方法
- JScriptのブロック側でオリジナルのResponseオブジェクトを別名の変数に入れます。
- VBScriptのブロック側でクラスを定義します。Responseオブジェクトのメソッド等を実装します。
- VBScriptのブロックでResponseという名前の変数を用意して定義したクラスをNewします。
サンプルコード
<script language="JScript" runat="server">
var jResponse_asp_original = Response;
</script>
<%
Class ClsResponse_Ver2
Public Property Let Buffer(ByVal Val)
jResponse_asp_original.Buffer = Val
End Property
Public Property Get Buffer()
Buffer = jResponse_asp_original.Buffer
End Property
Public Property Let CacheControl(ByVal Val)
jResponse_asp_original.CacheControl = Val
End Property
Public Property Get CacheControl()
CacheControl = jResponse_asp_original.CacheControl
End Property
Public Property Let Charset(ByVal Val)
jResponse_asp_original.Charset = Val
End Property
Public Property Get Charset()
Charset = jResponse_asp_original.Charset
End Property
Public Property Let CodePage(ByVal Val)
jResponse_asp_original.CodePage = Val
End Property
Public Property Get CodePage()
CodePage = jResponse_asp_original.CodePage
End Property
Public Property Let ContentType(ByVal Val)
jResponse_asp_original.ContentType = Val
End Property
Public Property Get ContentType()
ContentType = jResponse_asp_original.ContentType
End Property
Public Property Get Cookies(ByVal Val)
Set Cookies = jResponse_asp_original.Cookies(Val)
End Property
Public Property Let Cookies(ByVal Index, ByVal Val)
jResponse_asp_original.Cookies(Index) = Val
End Property
Public Property Let Expires(ByVal Val)
jResponse_asp_original.Expires = Val
End Property
Public Property Get Expires()
Expires = jResponse_asp_original.Expires
End Property
Public Property Let ExpiresAbsolute(ByVal Val)
jResponse_asp_original.ExpiresAbsolute = Val
End Property
Public Property Get ExpiresAbsolute()
ExpiresAbsolute = jResponse_asp_original.ExpiresAbsolute
End Property
Public Property Let IsClientConnected(ByVal Val)
jResponse_asp_original.IsClientConnected = Val
End Property
Public Property Get IsClientConnected()
IsClientConnected = jResponse_asp_original.IsClientConnected
End Property
Public Property Let LCID(ByVal Val)
jResponse_asp_original.LCID = Val
End Property
Public Property Get LCID()
LCID = jResponse_asp_original.LCID
End Property
Public Property Let PICS(ByVal Val)
jResponse_asp_original.PICS = Val
End Property
Public Property Get PICS()
PICS = jResponse_asp_original.PICS
End Property
Public Property Let Status(ByVal Val)
jResponse_asp_original.Status = Val
End Property
Public Property Get Status()
Status = jResponse_asp_original.Status
End Property
Sub AddHeader(ByVal name, ByVal value)
Call jResponse_asp_original.AddHeader(name, value)
End Sub
Sub AppendToLog(ByVal Val)
Call jResponse_asp_original.AppendToLog(Val)
End Sub
Sub BinaryWrite(ByVal Val)
Call jResponse_asp_original.BinaryWrite(Val)
End Sub
Sub Clear()
Call jResponse_asp_original.Clear
End Sub
Sub [End]()
Call jResponse_asp_original.End
End Sub
Sub Flush()
Call jResponse_asp_original.Flush
End Sub
Sub Redirect(ByVal Val)
Call jResponse_asp_original.Redirect(Val)
End Sub
Sub Write(ByVal Val)
jResponse_asp_original.Write Val
End Sub
Sub WriteBlock(ByVal Val)
jResponse_asp_original.WriteBlock Val
End Sub
End Class
Dim Response
Set Response = New ClsResponse_Ver2
%>
サンプルコード説明
サンプルは内部処理を何も変更していません。変更する場合は各メソッドやプロパティのロジックを好きなようにいじればOKです。
何も処理させたくなければ中のロジックを書かなければいいだけです。
CookiesやWriteBlockの実装
WriteBlockはドキュメント化されてないものです。差し替えた際にエラーとなりこのメソッドの存在を知りました。
<% %> このブロックの外でhtmlを書いた場合に呼ばれるメソッドかと思います。
Cookiesは最初単純にGetとSetのプロパティにしましたが上手く動かず、クッキー名を引数にもらうタイプのプロパティにしてあります。
最後に
この差し替え方法を使えば、他の組み込みオブジェクトの差し替えも可能になると思います。
HTMLEncodeやURLEncodeを今の時代に合うものに差し替えたり
Sessionをべつのもので持つような事も出来るかもしれません。