如果文件不存在,我如何路由带有asp扩展名的URL,但是如果它存在,则路由到文件?

时间:2013-12-30 19:46:27

标签: asp.net-mvc asp.net-mvc-routing

我有一个遗留网站,它是Classic ASP和WebForms / ASPX的混合体。我想将整个事情迁移到MVC,我的第一个目标是能够将ASP文件的请求路由到新的控制器和视图,因为我将ASP迁移到MVC。我想这样做,以便存在的ASP文件请求由文件本身(传统模式)处理,但我希望能够删除ASP文件并将其功能迁移到控制器和视图,并拥有MVC检测到文件不存在,并路由到控制器。

我试过了:

    routes.MapRoute(
            "ASP",
            "{resource}.asp/{*pathInfo}",
            New With {.controller = "Asp", .action = "Index"}
        )

但它根本行不通。如果我请求不存在的页面/xyz.asp,我只需获得404,并忽略该路由。

如何启用我想要的行为?

1 个答案:

答案 0 :(得分:0)

受到this related SO questionthis post on HttpHandlers by Scott Hanselman的启发,我决定这样做:

我将所有.asp文件移动到名为LegacyAsp

的其他位置

我添加了一个名为LegacyAspHandler的HttpHandler,并在web.config中配置它以处理对ASP文件的任何请求:

  <add name="LegacyAspHandler" verb="*" path="*.asp"
    type="MyNamespace.LegacyAspHandler, MyAssembly" preCondition="managedHandler"/>

在处理程序中,我转换传入的请求路径,它在磁盘上查找文件,以在新位置查找相同的文件:

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
    'the path to the legacy version
    Dim sPath = context.Request.PhysicalPath.Replace([OriginalPath], "LegacyAsp")

    'if the physical file exists
    If System.IO.File.Exists(sPath) Then
        'transfer to it
        context.Server.TransferRequest(context.Request.RawUrl.Replace([OriginalPath], "LegacyAsp"))
        Return
    End If

    'do the logic that replaces the missing ASP page

    'write the result so that the client sees it
    context.Response.Write([New Content])
End Sub

这样,如果原始ASP文件存在,则使用它,如果不存在,我们使用新的ASP.NET逻辑。所以我可以保留经典ASP的东西,但是当我将逻辑移植到.NET时,它会无缝切换。