当文件实际存在于指定位置时的MVC路由

所以我在IIS 7下运行的MVC 3应用程序中有这样的路由:

routes.MapRoute( "VirtualTourConfig", "virtualtour/config.xml", new { controller = "VirtualTour", action = "Config" } ); 

诀窍是文件实际存在于/virtualtour/config.xml中。 似乎请求只是在该位置返回xml文件而不是命中路径,该路由处理XML,进行一些更改并返回自定义XmlResult。

有关如何告诉我的应用程序命中路由而不是文件存在于磁盘上的实际文件的任何建议?

编辑:看来我可以使用routes.RouteExistingFiles = true; 在Global.asax的RegisterRoutes方法中告诉应用程序忽略磁盘上的文件。 但是,这会在全局范围内设置标志并在应用程序中中断许多其他请求。 例如,我仍然希望调用/assets/css/site.css来返回CSS文件,而无需为每个静态资产专门设置路由。 那么现在的问题是,有没有办法在每个路由的基础上做到这一点?

到目前为止,我发现的最佳答案是全局应用routes.RouteExistingFiles=true然后选择性地忽略我想要传递给现有文件的路由,如.js,.css等。所以我最终得到类似的东西这个:

 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("*.js|css|swf"); routes.RouteExistingFiles = true; routes.MapRoute( "VirtualTourConfig", "virtualtour/config.xml", new { controller = "VirtualTour", action = "Config" } ); } 

如果有人有更好的解决方案,我希望看到它。 我更倾向于选择性地将“RouteExistingFIles”标志应用于各个路线,但我不知道是否有办法做到这一点。

这里没有解决方案,只是一个想法。

您可以尝试基于您自己的VirtualPathProvider实现解决方案,该解决方案将提供您自己的Web路径到文件系统路径的映射,并为您不想处理的所有路径使用默认提供程序。

一个非常简单的解决方案,当然,如果你考虑斯科特的答案,将是例如: routes.IgnoreRoute("templates/*.html");routes.IgnoreRoute("scripts/*.js");routes.IgnoreRoute("styles/*.css");

这为您提供了仅提供RoutesCollection路径的简单性,并避免了必须启动的工作。 VirtualPathProvider。

您可以尝试UrlRewiting,例如:

           

NB我正在使用它用于不同的用例(即从asp.net MVC提供角度应用程序) – 我还没有测试在URL重写后是否发生MVC路由。

在我的情况下,我有一个普通的MVC路由(即/Dashboard/ => DashboardController.Index() )但需要Views/Dashboard/Index.cshtml中的所有相对路径来提供静态文件而不会被MVC路由混淆,即/Dashboard/app/app.module.js必须提供静态文件。 我使用UrlRewriting将/Dashboard/(.+)映射到/ng/Dashboard/{R:1} ,如下所示: