【问题标题】:How to create an MVC route to intercept classic ASP URLs?如何创建 MVC 路由来拦截经典的 ASP URL?
【发布时间】:2015-10-19 17:31:32
【问题描述】:

我的问题

如何构造一个路由,以便 MVC 拦截经典的 ASP URL 并执行 MVC 操作?

我正在将传统的经典 ASP 应用程序迁移到 MVC,并且需要让 MVC 拦截几个传统的 ASP URL,因为它们是外部访问应用程序的主要端点。但我似乎无法弄清楚如何正确地做到这一点。

我检查了其他几个问题,但没有完全找到我要查找的内容,但也许我今天的搜索结果很差。 This one 特定于区域,但看起来与我的相似,但仍然无法正常工作,this one 是一种可能的解决方法,但我真的更愿意在 MVC 中完全处理这个问题并完全消除遗留文件。

我想做的事

给定:/foo/bar.asp

映射到:/InboundLinks/HandleBar

(一个 URL 将是 GET 请求,但另一个 URL 将是包含一些敏感数据的 POST,因此我需要拦截它们并且 POST 数据仍然可用于 MVC,不确定 301 重定向是否会这样做或不是)

我不想做的事

我根本不想运行经典的 ASP 页面。 (如果这是唯一的解决方法,我愿意让它只做一个 301 重定向到 MVC URL,但就是这样)我希望这些 URL 被 MVC 拦截和处理。我这样说是因为我在这里和其他地方发现的一些问题似乎在这一点上产生了一些混乱。

我已经尝试过的

routes.MapRoute(
    name: "LegacyBarUrl",
    url:  "foo/bar.asp",
    defaults: new { controller = "InboundLinks", action = "HandleBar" }
);

但这会返回 404 Not Found 错误。

环境

Visual Studio 2013 在 Windows 7 上以本地开发模式运行。部署将在我无法控制的锁定服务器上部署到 IIS 7,因此不幸的是,无法在服务器上安装 HTTP 模块。域将保持不变。

非常感谢您提供任何帮助/指导/等。

【问题讨论】:

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


    【解决方案1】:

    你尝试过的必须工作。确保它位于您的路由配置的顶部,并且默认路由位于它之后

    public static void RegisterRoutes(RouteCollection routes)
    {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
         routes.MapRoute(
                name: "LegacyBarUrl",
                url:  "foo/bar.asp",
                defaults: new { controller = "InboundLinks", action = "HandleBar" }
                namespaces: new[] { "YourProject.Controllers" }
         );
    
         routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "YourProject.Controllers" }
         );
    }
    

    编辑:

    好的,我自己也试过了,真的不行。所以你有两个选择:

    (1) 在IIS 级别捕获和路由您的请求:如果您采用此路径,此扩展程序可能会很有帮助:http://www.iis.net/downloads/microsoft/url-rewrite]

    (2) 自己编写RouteBase 并重定向遗留路由之前 MVC 查找路由表:如果你走这条路,这篇文章对你很有帮助(也很长在这里写代码):http://www.mikesdotnetting.com/article/108/handling-legacy-urls-with-asp-net-mvc

    【讨论】:

    • 是的,我也是这么想的,但不幸的是,路径“/foo/bar.asp”得到了 404。我尝试了一些其他路径,例如我可以拦截路径“/test”,但不能拦截也返回 404 的“/test.asp”。我正在做本地开发,没有单独的 IIS 实例,但似乎配置了进程内 IIS也可以查找 ASP 文件。所以我得看看有没有办法把它关掉。
    • 关于经典 ASP 的 IIS Express 文档非常有限,其中大部分是关于如何启用调试的。 %userprofile%\documents\iisexpress\config\applicationhost.config 有一个配置文件,其中包含几个用于经典 ASP 的指令。禁用所有这些会导致 IIS Express 无法启动,而保留第一个 section 未注释允许 IIS Express 启动,但仍会查找 .asp 文件而不是使用 MVC 路由。不确定它在部署的服务器中是否会有所不同...
    • 如果您打算在 IIS 级别进行路由,您可能需要检查此扩展:[iis.net/downloads/microsoft/url-rewrite]
    • 更新了答案,我认为这两个是你唯一的选择。
    • 很有趣,感谢您再次尝试。我也试过routes.RouteExistingFiles = true,但没用。然而,该设置与this answer 结合成功了,因为它不仅拦截了 .asp 路径,还拦截了 所有 静态文件请求,包括 CSS 和图像,所以它打破布局。但是在这种情况下,路线 确实 有效。所以看来我有一个全有或全无的方法。当我回来工作时,我会看看你提供的另外两个链接,也许我可以使用一个。如果成功,将更新此问题。谢谢!
    【解决方案2】:

    对于遇到此问题的任何人,404 是因为服务器在进入路由之前正在寻找物理文件。需要的是扩展的处理程序,在这种情况下,对于将捕获请求的经典 asp,服务器不再查找文件,请求由您的处理程序处理。

    在 handlers 部分的 web 配置文件中添加一个条目,如下所示:

    <add name="ClassicASPHandler" path="*.asp" verb="GET" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    

    然后将需要的路由添加到配置路由表中。现在,路由将得到正确处理,而不是查找文件并返回 404。

    routes.MapRoute(
                name: "LegacyBarUrl",
                url:  "foo/bar.asp",
                defaults: new { controller = "InboundLinks", action = "HandleBar" }
                namespaces: new[] { "YourProject.Controllers" }
         );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-22
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2011-06-08
      相关资源
      最近更新 更多