我的问题预先
如何构建路由以便MVC拦截经典的ASP URL而不是执行MVC操作?
我正在将传统的经典ASP应用程序迁移到MVC,并且需要让MVC拦截几个旧的ASP URL,因为它们是外部访问应用程序的主要端点。但我似乎无法弄清楚如何正确地做到这一点。
我检查了一些其他问题,并没有找到我正在寻找的东西,但也许我的搜索功能今天很差。 This one特定于区域,但看起来与我的相似,但仍然不起作用,this one是一种可行的解决方法,但我真的宁愿在MVC中完全处理它并完全消除遗留文件。 / p>
我想做什么
鉴于:/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 错误。
环境
在Windows 7上以本地开发模式运行的Visual Studio 2013.部署将在我无法控制的锁定服务器上运行到IIS 7,因此不幸的是,在服务器上安装HTTP模块不是一个选项。域名将保持不变。
非常感谢任何帮助/指导等等。
答案 0 :(得分: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
答案 1 :(得分:1)
对于遇到此问题的任何人来说,404是因为服务器在进入路径之前正在查找物理文件。我们需要的是扩展的处理程序,在这种情况下是经典的asp,它将捕获请求,因此服务器不再查找文件,并且请求由处理程序处理。
在处理程序部分的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" }
);