经典ASP:在处理实际.asp文件之前,在每个请求的开头运行一些代码



这是经典的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

也可以每页,您可以使用onLoadonUnload事件

https://msdn.microsoft.com/en-us/library/ms952648.aspx

相关内容

最新更新