2

このコードを含むグローバルinclude.aspファイルがあります:

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

他の2つのファイル、content.aspおよびerror404.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

どうすれば無限ループを回避できますか?私はこれらの回避策を念頭に置いていました:

A

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

しかし、コードからエラーファイルの名前を取得できないようです(サーバー変数の内部を調べました。すべてのポイント変数は呼び出し元のファイル、つまりコンテンツを参照しています)。

B

共有変数を使用します。たとえば、コンテンツファイルでBeingExecuted = trueを設定し、エラーファイル内で確認しますが、Server.Executeの問題は、実行されたスクリプトが呼び出し元のファイルの変数にアクセスできないことです。

ご意見をお聞かせください。

4

2 に答える 2

2

あなたは正しいです。Server.Execute の性質上、呼び出されるスクリプトはその実際の起源を知らず、それを見つける方法が見つかりませんでした。

そうは言っても、醜い回避策に頼らなければならないのではないかと心配しています。私が考えることができる最も信頼できるのは、セッション変数を「共有変数」として使用することです。

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

本当に include.asp を 404.asp に含める必要がある場合は、"Somecondition" のテストがサブルーチンまたは関数内にあることを願っています。include.asp 内で変数を定義するだけでなく、404.asp でこれを true に設定し、条件でテストします。

したがって:

インクルード.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 に答える