2

ASP Classic Web サイト (実際には、より大きな Web サイトの下の仮想ディレクトリ) を ASP.NET 3.5 にアップグレードしています。ASP Classic のままの従来のディレクトリがいくつかあります。それ以外では、すべての .asp ファイルは、ディレクトリ階層内の同じ場所にある .aspx ファイルに置き換えられます。他の場所からサイトに来る古いリンクを壊したくありません。Web サイトは IIS 6 でホストされています (これは制御できません)。

私のアイデアは、IIS で、.asp ファイルの通常のハンドラーである asp.dll を aspnet_isapi.dll に置き換えることでした。最初の質問:その場合、.asp ファイルに対する要求は、作成して web.config に登録したカスタム HTTP モジュールを介してルーティングされますか?

次に、要求のパス (クエリ文字列の前) が .asp で終わるかどうかをテストする、BeginRequest にフックされる HTTP モジュールを作成します。その場合、物理ファイルが存在するかどうかを確認します。そうでない場合は、HttpContext.RewritePath を使用して「x」を「.asp」に追加します。それ以外の場合、.asp ファイルが存在する場合は、HttpContext.RemapHandler を使用してハンドラーを asp.dll に切り替え、ファイルが ASP Classic ファイルとして処理されるようにします。

2 番目の質問:これは機能しますか? 3 番目の質問: RemapHandler メソッドの引数として何を使用しますか? ASP Classic ハンドラのインスタンスへの参照を取得するにはどうすればよいですか? (3 番目の質問に対する答えを知っていれば、すべて自分で試してみたのに!)

更新: OK、自分で試してみましたが、拡張子が .aspc (ASP Classic) になるように残りの .asp ファイルの名前を変更し、IIS で古い asp.dll をハンドラーとして割り当てました。次に、要求された .asp ファイルが存在するかどうかを確認し、存在する場合は ASP Classic ハンドラーに再マッピングする代わりに、対応する物理的な場所に拡張子 .aspc 以外のファイルが存在するかどうかを確認しました。その場合は、URL を書き直して「c」を追加します。これはうまくいきました!したがって、上記の最初の質問に対する答えは「はい」であり、2 番目の質問に対する答えは「ほとんどの場合、ハンドラーの再マッピングに関する部分が不明であることを除いて」です。しかし、すべてのレガシー .asp ファイルの拡張子を変更する必要がないことが望ましいので、1 つの疑問が残ります。: 元の RemapHandler アプローチは機能しますか? もしそうなら、その引数は何ですか?

4

1 に答える 1

0

IIS で web.config ファイルとリダイレクト ルールを使用すると、これを非常に簡単に処理できることをご存知でしたか?

ここで説明されている URL Rewrite2 モジュールを有効にする必要があります。これは、ルーティングの問題を解決する IIS の非常に優れた機能です。いくつかの例については、こちらも参照してください。

あなたのケースを見て、私はこれに沿って何かをします:

<rule name="execute classic asp if file exists" stopProcessing="true">
  <match url="(\w+\.asp)$" />
  <conditions>
    <add input="C:\Path\To\Your\WebApp\{R:1}.asp" matchType="IsFile" />
  </conditions>
  <action type="Rewrite" url="{R:1}c" appendQueryString="true" />
</rule>
<rule name="execute dotnet otherwise" stopProcessing="true">
  <match url="(\w+\.asp)$" />
  <action type="Rewrite" url="{R:1}x" appendQueryString="true" />
</rule>

ここにあるすべての正規表現が機能するかどうかはわかりませんが、実験の開始を意味しています。明示的に記述する理由C:\Path\To\Your\WebApp\は、Web アプリのベース パスをパラメーターとして取得する方法が見つからなかったためです。

于 2013-05-29T07:33:58.250 に答える