2

我有一个include.asp包含以下代码的全局文件:

if SomeCondition then
    Response.Clear
    Response.Status = "404 Not Found"
    Server.Execute "/error404.asp"
    Respnse.End
end if

另外两个文件,content.asperror404.asp#include 这个文件。

内容文件将SomeCondition设置为 true ,从而导致错误页面为Server.Execute。但是,在错误页面中,同样的情况也会成立。这会创建一个无限循环,我最终会遇到以下错误:

Server object error 'ASP 0227 : 80004005'
Server.Execute Failed
/include.asp, line 1111
The call to Server.Execute failed

如何避免无限循环?我想到了这些解决方法:

一种

if SomeCondition then
    if GetExecutedFileNameSomehow() <> "error404.asp" then
       ' ...
    end if
end if

但我似乎无法通过代码获取错误文件的名称(我查看了服务器变量,所有点变量都引用了调用文件,即内容)。

在内容文件中使用共享变量,例如 set BeingExecuted = true并在错误文件中检查它,但 Server.Execute 的问题是执行的脚本无法访问调用文件的变量。

请指教。

4

2 回答 2

2

你是对的,由于 Server.Execute 的性质,被调用的脚本不知道它的真实来源,我没有找到任何方法来找到它。

也就是说,我担心您将不得不求助于丑陋的解决方法,我能想到的最可靠的方法是将 Session 变量用作“共享变量”。

include.asp中有这样的代码:

strFileToExecute = "/error404.asp"
If (Session("currently_executing")<>strFileToExecute) And (SomeCondition) Then
    Response.Clear
    Response.Status = "404 Not Found"
    Session("currently_executing") = strFileToExecute
    Server.Execute strFileToExecute
    Session("currently_executing") = ""
    Response.End
End If

逻辑是在调用 Execute 方法之前设置 Session 变量。这样,当执行error404.asp并再次包含相同的代码时,将设置 Session 变量的值,并且您知道要中止操作,从而避免死循环。

于 2012-11-12T13:10:50.597 回答
0

如果你真的必须在 404.asp 中包含 include.asp,我希望你对“Somecondition”的测试是在子函数或函数中。您可以在 include.asp 中定义一个变量,在 404.asp 中将其设置为 true 并在您的条件下对其进行测试。

因此:

里面include.asp

Dim blnNot404page : blnNot404page = true

在 404.asp 内部(在包含 include.asp 之后的代码中)

blnNot404page = false

再次在include.asp里面

if (SomeCondition and blnNot404page) then
    Response.Clear 
    Response.Status = "404 Not Found"
    Server.Execute "/error404.asp"
    Response.End
end if
于 2012-11-09T20:26:30.927 回答