ASP.NET HttpContext.RemapHandler重新映射到ASP Classic

ASP.NET HttpContext.RemapHandler重新映射到ASP Classic,asp.net,asp-classic,httphandler,httpmodule,Asp.net,Asp Classic,Httphandler,Httpmodule,我们正在将一个ASP经典网站(实际上是一个较大网站下的虚拟目录)升级到ASP.NET3.5。将有一些遗留目录仍然是ASP经典目录。除此之外,每个.asp文件都将替换为目录层次结构中相同位置的.aspx文件。我们不想打破从别处进入网站的旧链接。该网站托管在IIS 6上(我们对此没有控制权) 我的想法是,在IIS中,用aspnet_isapi.dll替换.asp文件的常用处理程序asp.dll第一个问题:如果我这样做,对.asp文件的请求是否会通过我在web.config中创建和注册的任何自定义HT

我们正在将一个ASP经典网站(实际上是一个较大网站下的虚拟目录)升级到ASP.NET3.5。将有一些遗留目录仍然是ASP经典目录。除此之外,每个.asp文件都将替换为目录层次结构中相同位置的.aspx文件。我们不想打破从别处进入网站的旧链接。该网站托管在IIS 6上(我们对此没有控制权)

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

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

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


更新:好的,我自己也试过了,只是我重命名了其余的.asp文件,使其扩展名为.aspc(asp Classic),并且在IIS中我将旧的asp.dll指定为它们的处理程序。然后,我没有检查请求的.asp文件是否存在并重新映射到asp Classic处理程序(如果存在),而是检查相应物理位置中是否存在扩展名为.aspc的文件。如果是这样,我重写URL以附加“c”。这成功了!因此,我上面第一个问题的答案是“是”,第二个问题的答案是“是的,基本上是这样,只是关于重新映射处理程序的部分是未知的”。但是最好不要更改所有遗留.asp文件的扩展名,因此我还有一个问题:原始的RemapHandler方法是否有效,如果有效,它的论点是什么?

您知道吗,使用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应用程序的基本路径作为参数。

404错误的自定义错误页不起作用吗?否则,你是否检查了前一篇SO帖子:谢谢你提供了指向前一篇讨论的指针。我以前从未见过它。我将建议的BuildProvider和httpHandler代码添加到web.config中。它现在正试图解析页面,但在每一行带有VBScript注释(位于单引号右侧)的行上,它都会给我“常量中的换行符”和“字符文字中的字符太多”,似乎它现在认为单引号应该是字符串分隔符而不是注释标记。我将其添加到一个.asp文件的顶部,并再次请求它。这消除了前面的错误,但现在它也开始起作用,好像我添加了optionexplicit,尽管我没有添加。它开始用“Declaration expected”标记赋值语句。然后我声明了前两个变量,然后它接受了它们,然后在Set语句上出错:“BC30807:‘Let’和‘Set’赋值语句不再受支持。”你知道怎么回事吗?哦,它还将我的Dim语句标记为“BC42020:不带'As'子句的变量声明;假设对象的类型。“由于这是VBScript,一种非类型化语言,我真的很好奇到底发生了什么。顺便说一下,我不知道这是否有什么区别,但到目前为止所有被标记的假定错误都在主页中包含的#include文件中。