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

Sco*_*ott 9 c# asp.net-mvc routing

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

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

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

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

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

Sco*_*ott 6

到目前为止,我发现的最佳答案是全局应用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" }
               );
}
Run Code Online (Sandbox Code Playgroud)

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