【问题标题】:ASP.NET HttpContext.RemapHandler to remap to ASP ClassicASP.NET HttpContext.RemapHandler 重新映射到 ASP Classic
【发布时间】:2013-01-22 08:34:26
【问题描述】:

我们正在将 ASP Classic 网站(实际上是更大网站下的虚拟目录)升级到 ASP.NET 3.5。将有一些遗留目录仍然是 ASP Classic。除此之外,每个 .asp 文件都将替换为目录层次结构中相同位置的 .aspx 文件。我们不想破坏从其他地方进入网站的旧链接。该网站托管在 IIS 6 上(我们无法控制)。

我的想法是,在 IIS 中,将 .asp 文件的常用处理程序 asp.dll 替换为 aspnet_isapi.dll。 第一个问题:如果我这样做,对 .asp 文件的请求是否会通过我在 web.config 中创建和注册的任何自定义 HTTP 模块进行路由?

然后我将创建一个连接到 BeginRequest 的 HTTP 模块,该模块将测试请求的路径(在任何查询字符串之前)是否以 .asp 结尾。如果是,它将检查物理文件是否存在。如果没有,那么我将使用 HttpContext.RewritePath 将“x”附加到“.asp”。否则,如果 .asp 文件确实存在,我将使用 HttpContext.RemapHandler 将处理程序切换回 asp.dll,以便将文件作为 ASP Classic 文件处理。

第二个问题:这行得通吗? 第三个问题:我使用什么作为 RemapHandler 方法的参数?如何获取对 ASP Classic 处理程序实例的引用? (如果我知道第三个问题的答案,我会自己尝试所有这些!)

更新:好的,我自己也试过了,只是我重命名了剩余的 .asp 文件,使它们的扩展名是 .aspc(ASP 经典),并且在 IIS 中我分配了旧的 asp .dll 作为他们的处理程序。然后,我没有检查请求的 .asp 文件是否存在,如果存在则重新映射到 ASP Classic 处理程序,而是检查了相应物理位置中的文件是否存在除了扩展名为 .aspc。如果是这样,我会重写 URL 以附加“c”。这行得通!因此,上面我的第一个问题的答案是“是”,而我的第二个问题的答案是“是的,差不多,只是关于重新映射处理程序的部分是未知的”。但是最好不必更改所有旧 .asp 文件的扩展名,所以我只剩下一个问题:原始的 RemapHandler 方法是否有效,如果有效,它的论点是什么?

【问题讨论】:

  • 用于 404 错误的自定义错误页面不起作用吗?否则,您是否查看过之前的 SO 帖子:stackoverflow.com/questions/1572746/…
  • 感谢您提供指向先前讨论的指针。我以前没有遇到过。我将建议的 BuildProvider 和 httpHandler 代码添加到 web.config。它现在正在尝试解析页面,但是在带有 VBScript 注释的每一行(单引号右侧的所有内容)它都给了我“常量换行符”和“字符文字中的字符太多”,就好像它现在一样认为单引号应该是字符串分隔符而不是注释标记。
  • 我将 添加到我的一个 .asp 文件的顶部并再次请求它。这摆脱了以前的错误,但现在它也开始表现得好像我添加了 Option Explicit ,即使我没有添加。它开始用“预期声明”标记赋值语句。然后我声明了前几个变量,之后它接受了它们,然后在 Set 语句上出错:“BC30807:不再支持'Let'和'Set'赋值语句。”有什么想法吗?
  • 哦,它还将我的 Dim 语句标记为“BC42020:没有‘As’子句的变量声明;假定的对象类型。”由于这是 VBScript,一种无类型语言,我真的很好奇发生了什么。
  • 顺便说一句,我不知道这是否有什么不同,但到目前为止,所有这些被标记的假定错误都在主页中包含的#include 文件中。跨度>

标签: asp.net asp-classic httphandler httpmodule


【解决方案1】:

您知道吗,您可以使用 web.config 文件和 IIS 中的重定向规则轻松处理此问题?

您需要激活here 中描述的 URL Rewrite2 模块。 这是 IIS 的一个非常好的特性,用于解决路由问题,参见 here 也有一些示例。

看看你的情况,我会做一些类似的事情:

<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>

我不确定这里的所有 RegEx 是否都适合您,但它意味着作为实验的开始。明确写C:\Path\To\Your\WebApp\ 的原因是,我没有找到将网络应用程序的基本路径作为参数的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2023-03-28
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多