什么是routes.IgnoreRoute("{resource} .axd/{*pathInfo}")

Eri*_*Yin 91 asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

什么是 routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

我在项目中找不到任何.axd文件,我可以删除此路由规则吗?

Roy*_*tus 75

.axd文件在物理上不存在.ASP.NET在内部使用带有.axd扩展名的URL(ScriptResource.axd和WebResource.axd),它们由HttpHandler处理.

因此,您应该遵守此规则,以防止ASP.NET MVC尝试处理请求,而不是让专用的HttpHandler执行此操作.

  • 我很确定你希望人们能够在你的网站上下载"axd文件",因为它们包含javascript和样式. (4认同)
  • 这在 .NET core 中完全没有必要吗?我在 Google 上搜索了一个小时左右,但找不到任何有关等效步骤的参考资料,所以我假设根本不需要它。 (4认同)
  • 这个答案是不正确的.将`IgnoreRoute`放入MVC的路由配置中的原因是为了确保MVC不会尝试处理请求.这是因为`.axd`端点需要由另一个HTTP处理程序(一个*不是MVC的一部分的处理程序)来处理,以便提供脚本. (2认同)

Cod*_*shi 26

一些背景

如果你打开这个文件:

%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config
Run Code Online (Sandbox Code Playgroud)

你会在文件中找到这个:

<add path="WebResource.axd"
     verb="GET"
     type="System.Web.Handlers.AssemblyResourceLoader"
     validate="True" />
Run Code Online (Sandbox Code Playgroud)

这基本上是告诉Asp.NET运行时:"嘿asp.net dude,如果请求WebResource.axd然后使用AssemblyResourceLoader来处理请求."

注意,WebResource.axd不是一个文件,而只是一个地图(如果我可以说)AssemblyResourceLoader.它是处理程序注册的名称.在我的机器上,我找到了以下.axd处理程序:

<add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
<add verb="*" path="*_AppService.axd" 
Run Code Online (Sandbox Code Playgroud)

好的,那个处理程序做了什么?

AssemblyResourceLoader知道如何寻找嵌入的文件汇编中,以便它可以成为它(将其发送到客户端,即浏览器).例如,在asp.net Web表单中,如果使用验证控件,它们依赖于某些javascript来显示网页上的错误.但是,javascript嵌入在程序集中.浏览器需要javascript,所以你会在页面的html中看到这个:

<script src="/YourSite/WebResource.axd?d=fs7zUa...&amp;t=6342..." type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

AssemblyResourceLoader会发现其中的JavaScript使用的查询字符串信息嵌入装配和返回的JavaScript.


回到问题

那么回答这个问题是什么:

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

这告诉路由引擎我们不会处理那些匹配该路由模式的请求.换句话说,我们不会处理.axd请求.为什么?因为MVC本身类似于一个HttpHandler .axd.aspx那些在web.config文件和许多其他处理.MVC处理程序不知道如何处理请求,例如在程序集中查找嵌入式资源 - AssemblyResourceLoader知道如何执行此操作.MVC知道如何做,以及它所做的一切都超出了这个问题和答案的范围.

是一篇很好的文章,详细解释.axd.

  • 绝对肯定应该是接受的答案,加上我的答案. (2认同)

Kum*_*PMP 18

包含模式{resource} .axd/{*pathInfo}的路由是为了防止将Web资源文件(如WebResource.axd或ScriptResource.axd)的请求传递给控制器​​.

阅读链接:http: //msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx

您还可以指定路由不应处理某些URL请求.您可以通过定义路由并指定应使用StopRoutingHandler类来处理该模式来阻止路由处理某些请求.当StopRoutingHandler对象处理请求时,StopRoutingHandler对象会阻止对请求的任何其他处理作为路由.而是将请求作为ASP.NET页面,Web服务或其他ASP.NET端点处理.您可以使用RouteCollection.Ignore方法(或用于MVC应用程序的RouteCollectionExtensions.IgnoreRoute)来创建使用StopRoutingHandler类的路由.


Kum*_*PMP 7

这些不是文件(它们不存在于磁盘上) - 它们只是注册某些HTTP处理程序的名称.