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

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

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

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

routes.Ignore("community/123/plan/456/video/moviename.flv");
Run Code Online (Sandbox Code Playgroud)

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

我尝试过以下方法:

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

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

Cha*_*ndu 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(实现IRouteHandler的类).实际上,路由将忽略与"忽略路由"匹配的任何请求,并且将基于现有的http处理程序映射进行正常的ASP.NET处理.

因此,在我们的默认模板中,您会注意到我们定义了以下路径.

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)

这会处理标准的.axd请求.

........

我们只允许一个catch-all路由,它必须发生在URL的末尾.但是,您可以采取以下方法.在这个例子中,我添加了以下两个路由.

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

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