这是经典的ASP,在IIS 8.5上运行。
我需要运行一些在每个http请求开始时我所有 *.asp页面都应该是给这些 *.asp文件时的vbScript。
目前,我在每个 *.asp文件的顶部都使用#include
标签。我引用一个包含我要运行的代码的文件。
它可以解决问题,但是它很难看:如果碰巧一个 *.asp文件错过了#include
标签,则代码将不会运行。
是否有一种方法可以为每个 *.asp请求进行一些代码,而无需在每个 *.asp文件中编写代码?
在ASP.NET中,我们有HttpApplication.BeginRequest
事件。我要寻找的是等同于此的东西,但在经典的ASP中。我需要运行一些能够在每个 *.ASP请求的开头访问经典ASP对象的VBScript。
编辑:根据 @kul-tigin请求,这就是我想这样做的原因:我的 *.ASP文件在ANSI中编码。但是UTF-8中编码URL请求,这会产生问题。
如果我什么都不做,ASP引擎将解码URL(和查询字符串),就好像它们在ANSI中一样。例如:查询字符串?value=ç
将由浏览器发送为?value=%C3%A7
。C3A7是在UTF-8中编码的"ç"的字节。但是ASP引擎将2个字节读取为2个单独的ANSI字符。因此,如果我什么都不做,Request.QueryString("value")
将是一个带长度2的字符串,其中内容为"â§"。
为了解决此问题,我创建了以下解决方法,该解决方案有效:
Sub Workaround()
Response.CodePage = 65001 ' Temporarally set the Response CodePage to UTF-8. Originally it was 1252 (ANSI).
Dim foo
foo = Request.QueryString("foo") 'ASP engine uses the Response.CodePage to decode the querystring
Response.CodePage = 1252 ' Set the Response CodePage back to ANSI.
End Sub
Workaround()
我不在乎" foo"查询字符串,甚至可能不存在。我只是这样做是为了"触摸" ASP查询字符串避难引擎。显然,它在请求处理过程中首次使用它的所有查询字符串值。因此,即使将CodePage设置回1252,在我的上一个示例中,如果我读取混凝土查询字符串Request.QueryString("value")
,它将是一个长度1字符串,其中包含"ç",如意图。
我已经将解决方案代码放在workaround.inc
文件中,并将其包含在我的大多数 *.asp文件的开头,从而解决了问题。但是,有超过一千个 *.asp文件,还有更多待开发。不可能确保所有这些都包含workaround.inc
,这就是为什么我想为所有 *asp请求运行代码,而不论include tag。
我感谢您对我的问题的关注。如果您能提供更好的解决方案,我会很高兴。谢谢!
为了简单起见,我将使用一个常见的#include,本身可以根据页面标准#crude其他文件。
在经典ASP中,您可以拥有一个global.asa
文件,并使用2个事件以及2个应用程序2(跨应用程序)
应用程序(服务器启动/停止)
session (创建并完成/卸载用户会话时)
http://www.w3schools.com/asp/asp/asp/asp_globalasa.asp
也可以每页,您可以使用onLoad
和onUnload
事件
https://msdn.microsoft.com/en-us/library/ms952648.aspx