Server.Execute と ASP での Execute の違いは、動的インクルード スクリプトを実装するためのもので、必要な友人はそれを参照できます。最近、ASP で MVC アーキテクチャを実装しようと計画しました。誰かが私にこう尋ねたに違いありません。「ASP は廃止されたのに、なぜまだ勉強しているのですか?」これは私も知っていますが、Microsoft が ASP 3.0 を放棄して ASP.NET に切り替えて以来、ASP はほぼ同時に開始された PHP や JSP に大きく遅れをとっています。クローズド ソースに対するオープン ソースの利点は PHP と ASP と同じです。 ASP は廃止されると言われていますが、ASP は依然として中国市場で広く普及しており、特に一部の中小企業のアプリケーションでは普及していないことに注意してください。一部の古い Windows システムでは、.NET をインストールする必要がなく、簡単に導入できます。基本的にフレームワークは直接実行できるので、やはりフレームワークを用意する必要がありますが、私のフレームワークはあくまでASPがPHPと同様のMVCアーキテクチャを実装できるかどうかを検証するための実験的なフレームワークです。
さて、ここまで述べたところで、早速本題に入りましょう。この問題の原因は、ASP ファイルを動的にインクルードする必要があるためです。ご存知のとおり、ASP には SSI (Server Side Include) というインクルード メソッドが 1 つしかなく、基本的に次の 2 つのタイプに分けられます。
次のようにコードをコピーします。
<!-- #include file=sample.asp -->
<!-- #include virtual=sample.asp -->
基本的に、これら 2 つのうち、最初のものがより一般的に使用されます。 #include virtual には、仮想ディレクトリで一般に使用される仮想パスが含まれます。ただし、これらは両方とも静的であり、動的に含めたい場合は次のように記述することはできません。
次のようにコードをコピーします。
<!-- #include file=<%=MyVar%> -->
<!-- #include virtual=<%=MyVar%> -->
上記の記述は間違っています。#include ディレクティブは、ASP がスクリプト エンジンを起動する前に実行され、ASP<% %> タグの間のスクリプトを実行するということです。つまり、#include は ASP の仕事ではありません。 IIS の変換作業などのサーバー プログラムは、ASP コードには注意を払いません。
PHP の include、include_once、require、require_once に似た動的インクルージョン スクリプト メソッドを実装するにはどうすればよいですか? ASP サーバー オブジェクトのメソッド Server.Execute を見てみましょう。すべての ASP 機能を検索すると、この関数が動的インクルードに最も似ていることがわかります。次の実験を行ってください。
サンプル株式会社asp
次のようにコードをコピーします。
<%
応答。Hello World! と書き込みます。
%>
テスト.asp
次のようにコードをコピーします。
<%
Server.Execute Sample.inc.asp
Response.Write 私は test.asp です!
%>
実際の出力は Hello World!I am test.asp! となるはずです。これは、Server.Execute が動的インクルージョンで適切に機能することを示していますが、クラスまたは関数をインクルードしたい場合はどうすればよいでしょうか?次に次の実験を行ってください。
サンプル.クラス.asp
次のようにコードをコピーします。
<%
クラスサンプル
終了クラス
%>
テスト.asp
次のようにコードをコピーします。
<%
Server.Execute Sample.class.asp
Response.Write TypeName(Eval(新しいサンプル))
%>
これを直接実行すると、「Microsoft VBScript ランタイム エラー '800a01fa' クラスが定義されていません: 'サンプル'」というエラーが表示され、結果は非常に残念です。なぜこのようなことが起こるのでしょうか? MSDN を確認したところ、次の説明が見つかりました。 #include を使用してファイルが呼び出しページに含まれている場合、実行される .asp はそのファイルを使用しません。たとえば、呼び出しページに含まれるファイルにサブルーチンがある可能性があります。しかし、実行された .asp はサブルーチン名を認識しません。これは、私が遭遇した問題とは多少異なるようです。Server.Execute コードは分離されていますか?次に、次の実験を実行します。
サンプル株式会社asp
次のようにコードをコピーします。
<%
ディム・マイヴァー
MyVar = 私はサンプルです!
%>
テスト.asp
次のようにコードをコピーします。
<%
ディム・マイヴァー
MyVar = 私はテストです!
Server.Execute Sample.inc.asp
Response.Write MyVar
%>
出力は I am test! ですが、これは非常に残念です。 Server.Execute は変数、関数、クラス、その他のコードを分離しているようです。つまり、呼び出し側と呼び出された側がコードレベルで相互に干渉しないことを意味します。Server.Execute は をインクルードするためにのみ使用できるようです。 ASP テンプレート。
以下は VBScript スクリプト機能の Execute です。Execute に渡されるものは有効な VBScript スクリプト コードである必要があり、Execute は必要な動的インクルードに非常に近いようです。
テスト.asp
次のようにコードをコピーします。
<%
クラスの実行サンプル : クラスの終了
Response.Write TypeName(Eval(新しいサンプル))
%>
上記のコードは、必要な型名 Sample を正常に出力します。これは、Execute が確かにコンテキスト依存であることを証明していますが、問題は、Execute を使用して ASP ファイルを組み込むのは、VBScript スクリプトに付属する Server.Execute ほど便利ではないということです。したがって、ファイルの内容を一度読み取る必要があります。第二に、<% %> などの ASP を識別するために使用される一部のタグには、<%=MyVar %> に似た呼び出しメソッドがあるため、< をフィルタリングする必要があります。 % %> を実行し、<%=MyVar %> を Response.Write に変換します。マイヴァール。必要なのはクラス ファイルをインクルードすることなので、<%=MyVar %> は表示されず、単に <% %> を置き換えるだけです。ファイルの内容を読み取り、単純に <% %> を除外するには、次の関数を参照できます。
次のようにコードをコピーします。
関数 file_get_contents(ファイル名)
薄暗い fso、f
fso = Server.CreateObject(Scripting.FilesystemObject) を設定します。
Set f = fso.OpenTextFile(Server.MapPath(ファイル名), 1)
file_get_contents = f.ReadAll
f.閉じる
f = 何も設定しない
fso = なしを設定します
終了機能
関数 class_get_contents(ファイル名)
薄暗い内容
コンテンツ = file_get_contents(ファイル名)
内容 = 置換(内容, < & %, )
内容 = 置換(内容, % & >, )
class_get_contents = コンテンツ
終了機能
上記の関数を使用すると、次のコードを直接テストできます。
サンプル.クラス.asp
次のようにコードをコピーします。
<%
クラスサンプル
終了クラス
%>
テスト.asp
次のようにコードをコピーします。
<%
class_get_contents(Sample.class.asp)を実行
Response.Write TypeName(Eval(新しいサンプル))
%>
結果の出力は、私たちが予想したサンプル タイプの名前です。Execute は、悪意のある人々がポニーを作成するためによく使用するため、依然として非常に強力であるようです。次の文:
次のようにコードをコピーします: <%Execute Request(c)%>
たとえば、このスクリプトは file.asp にあり、file.asp?c=Trojan テキストを渡します。笑、次のことはすでにご存知でしょう。余談ですが、Execute についてもう 1 つ注意すべき点は、Execute がコンテキストに関連しているため、Execute がサブプロセスまたは関数関数内にある場合、外部からアクセスできないことです。