这两个ASP.NET MVC IgnoreRoute指令有什么区别?

时间:2011-08-22 19:34:47

标签: .net asp.net-mvc asp.net-mvc-routing ignoreroute

默认的ASP.NET MVC 3项目模板包含以下IgnoreRoute指令:

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

我现在看到多个项目改变了这一行(包括StackExchange's DataExplorer),而不是看起来像:

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});

任何人都可以解释在什么情况下或一般情况下为什么默认的.axd路由忽略不适合后一个版本?或者相反,为什么可能选择不使用后一个版本,而只是坚持默认?

我必须承认我并不完全理解IgnoreRoute语法,MSDN documentation on the subject非常简洁。

2 个答案:

答案 0 :(得分:6)

Phil Haack的博客中有一个解释:Make Routing Ignore Requests For A File Extension

引用菲尔的基本想法是:

  

对此的一个解决方案是添加适当的忽略路由以指示路由应忽略这些请求。不幸的是,我们做不到这样的事情:

{*path}.aspx/{*pathinfo}
  

我们只允许一个catch-all路由,它必须发生在URL的末尾。但是,您可以采取以下方法......

     

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

答案 1 :(得分:3)

原始帖子中两个IgnoreRoute来电之间的差异如下:

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

这会将请求与 /ScriptManager.axd /Foo.axd/bar/baz.aspx 等资源匹配,但将请求与您网站根目录下的任何 * .axd 资源匹配,例如 /foo/bar/Baz.axd

routes.IgnoreRoute("{*allaxd}", new {allaxd = @".*\.axd(/.*)?"});

此调用使用正则表达式将请求与您站点的任何级别的任何 * .axd 资源相匹配,例如 /foo/bar/Baz.axd 。因此,如果您引用站点根目录下的任何axd资源,则此调用将优先于第一个调用。

如果分解正则表达式,则开头的.*将匹配任何字符的0或更多。 \.axd将与文字字符串".axd"匹配,(/.*)?可选地匹配斜杠,后跟0或更多任何字符。

*网址格式中的{*allaxd}可确保扫描整个路径,而不仅仅是路径的一部分。 allaxd只是一个赋予路径匹配部分的arbtrary标签,在这种情况下将是整个路径。这种忽略路由的方法有效地允许您忽略特定文件扩展名的路由。您可以轻松复制此调用并进行一些更改,以忽略* .aspx,* .asmx等的路由。

有关路由的详细文档,我强烈推荐the following MSDN page