如何忽略MVC路由中的所有特定文件扩展名

时间:2011-01-13 18:54:34

标签: c# asp.net-mvc routing

如何配置IgnoreRoute以忽略具有特定扩展名的所有文件,无论它们位于哪个目录中?

如果我这样做,一切正常,我的Flash电影就会播放:

routes.Ignore("community/123/plan/456/video/moviename.flv");

因此“123”和“456”部分是可变的,可以是任何整数。显然,我不想为每部电影做其中一部分或者我是否需要用可变占位符替换123和456。这只是一种目录的一个例子,整个应用程序中都存储了Flash影片,因此我需要的是IgnoreRoute值,它将忽略具有.flv扩展名的文件,无论它们位于层次结构的哪个位置

我尝试了以下内容:

routes.IgnoreRoute("{file}.flv");
routes.IgnoreRoute("(.*).flv(.*)"); // Yeah I know, I'm horrible at RegEx

到目前为止我唯一可以开始工作的是专门传递FLV文件的完整相对路径。有什么建议吗?

1 个答案:

答案 0 :(得分:6)

由Phil Haack检查这篇文章:http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

  

长话短说,我们不希望路由尝试路由请求   对于静态文件,如图像。不幸的是,这导致了我们   当我们记得ASP.NET的许多功能时,我们会头疼   对磁盘上不存在的.axd文件的请求。

     

为了解决这个问题,我们在RouteCollection上添加了一个新的扩展方法,   IgnoreRoute,创建一个映射到StopRoutingHandler的Route   route handler(实现IRouteHandler的类)。实际上,任何   路由和将忽略匹配“忽略路由”的请求   正常的ASP.NET处理将基于现有的http处理程序进行   映射。

     

因此,在我们的默认模板中,您会注意到我们有以下内容   路线定义。

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
     

它处理标准的.axd请求。

     

........

     

我们只允许一条全能路线,而且必须在路线结束时发生   URL。但是,您可以采取以下方法。在这个例子中,我   增加了以下两条路线。

routes.IgnoreRoute("{*allaspx}", new {allaspx=@".*\.aspx(/.*)?"});
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"}); 
     

我在这里做的是一个   技术Eilon向我展示了将所有URL映射到这些路由,   但是然后通过约束限制忽略哪些路由   字典。所以在这种情况下,这些路线将匹配(从而忽略)   所有对favicon.ico的请求(无论哪个目录)以及   请求.aspx文件。因为我们告诉路由忽略这些   请求,将发生这些请求的正常ASP.NET处理。