什么是路由。IgnoreRoute(“ {resource} .axd / {* pathInfo}”)


Answers:


81

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

因此,应保留此规则,以防止ASP.NET MVC尝试处理请求,而不是让专用的HttpHandler进行处理。


5
我非常确定您希望人们能够在您的网站上下载“ axd文件”,因为它们包含JavaScript和样式。
Moulde

3
这个答案是不正确的。放入IgnoreRouteMVC路由配置的原因是要确保MVC不会尝试处理请求。这是因为.axd端点需要由另一个HTTP处理程序(属于MVC 的处理程序)处理才能提供脚本。
NightOwl888 '16

1
在.NET核心中这是否完全不必要?我已经在Google上搜索了一个小时左右,但找不到等效步骤的参考,因此我假设根本不需要它。
Dinerdo

35

一些背景

如果打开此文件:

%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config

您将在文件中找到此文件:

<add path="WebResource.axd"
     verb="GET"
     type="System.Web.Handlers.AssemblyResourceLoader"
     validate="True" />

这基本上是告诉Asp.NET运行时:“嘿,asp.net伙计,如果有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" 

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

AssemblyResourceLoader知道如何寻找嵌入文件内的组件,因此它可以成为它(将其发送到客户端,即浏览器)。例如,在asp.net Web表单中,如果使用验证控件,则它们依赖某些javascript在网页上显示错误。但是,该javascript嵌入在程序集中。浏览器需要javascript,因此您将在页面的html中看到它:

<script src="/YourSite/WebResource.axd?d=fs7zUa...&amp;t=6342..." type="text/javascript"></script>

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


回到问题

所以要回答这个问题,是什么:

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

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


2
这绝对绝对是应该接受的答案,再加上我的回答。
Yahya

最后,明确解释WebResource.axd的实际作用,同时还提供对该问题的明确答案。谢谢
ben_mj

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方法(或RouteCollectionExtensions.IgnoreRoute为MVC应用程序)创建使用路由StopRoutingHandler类。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.