7

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

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

我现在已经看到多个项目将这条线(包括StackExchange 的 DataExplorer)更改为如下所示:

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

任何人都可以解释在什么情况下或一般情况下为什么默认.axd路由忽略不足够而后一个版本是? 或者反过来说,为什么人们会选择不使用后一个版本而只使用默认版本?

我不得不承认我并不完全理解IgnoreRoute语法,而且关于这个主题的 MSDN 文档非常简洁。

4

2 回答 2

6

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

引用菲尔的话,基本思想是:

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

{*path}.aspx/{*pathinfo}

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

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

于 2011-08-22T19:50:21.493 回答
4

IgnoreRoute原始帖子中的两个调用之间的区别如下:

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

这将匹配对/ScriptManager.axd/Foo.axd/bar/baz.aspx等资源的请求,但不会匹配对站点根目录下的任何*.axd资源的请求,如/foo/bar/Baz。斧头_

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

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

如果分解正则表达式,.*开头的 将匹配 0 个或多个任意字符。\.axd将匹配文字 string ".axd",并且(/.*)?可以选择匹配后跟 0 个或多个任何字符的斜杠。

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

有关路由的详细文档,我强烈推荐以下 MSDN 页面

于 2013-03-07T13:29:30.703 回答