将asp URL映射到aspx Http [Handler / Module]

时间:2011-03-15 20:24:24

标签: asp.net url-rewriting httphandler httpmodule

我们正在为客户重写旧网站,从经典ASP ASP.NET 4 。一旦推送到现场,新网站将与旧网站生效。

但有一条规定是......旧网站过去常常使用article.asp?articleid=###等网页来加载内容。新网站将使用类似的东西,但使用ASP.NET路由,如~/articles/o/###('o'代表'旧ID')。

我需要能够捕获旧article.asp页面的请求,并将网址重写为新的article.aspx网址。

我最初的想法是在Application_BeginRequest处理这个问题。我重新映射.ASP扩展名由与.ASPX页面相同的处理程序dll处理,然后将以下代码添加到Application_BeginRequest中的global.asax

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim ctx = HttpContext.Current, url = ctx.Request.RawUrl
    If Regex.IsMatch(url, "/article\.asp\?articleid=\d+") Then
        Dim oldid = Regex.Match(url, "(?:articleid=)(\d+)").Groups(1).Value
        Server.Transfer("~/articles/o/" & oldid)
    End If
End Sub

但这不起作用。现在就是这样,我需要在路径中有一个实际的article.asp,否则我会收到 404 错误(即便如此,它实际上并没有做任何事情,只是显示一个空白页)。这样可以正常工作(假设ASP页面中的重定向代码有效),除了他们在自己的子目录中有500个article.asp副本(打破了CMS模型的整个点)。他们希望保留旧网址,以防有人点击电子邮件或书签中的旧网址。

我需要能够将此文件名映射到新路径,而不管它所在的子目录,根据上面Application_BeginRequest中的逻辑。这样做的正确方法是什么?由于global.asax不起作用,我假设我需要写一个HttpHandlerHttpModule类,但我不确定哪种方法是正确的。

在Windows Server 2003 R2上运行IIS。

谢谢!

1 个答案:

答案 0 :(得分:1)

将我的上述代码放在Application_BeginRequest global.asax方法中实际上是正确的位置。问题是IIS中缺少一个设置。在您将.ASP重新映射到ASP.NET处理程序的对话框中,您还需要确保关闭验证文件存在的选项。这完成了程序,我的旧页面现在映射到相应的新页面。