什么是routes.IgnoreRoute(“{资源} .axd / {* pathInfo}”)

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

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

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

因此,你应该保持这个规则,以防止ASP.NET MVC试图处理请求,而不是让专用的HttpHandler去做。

包含{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 )来创build使用StopRoutingHandler类的路由。

看看下面的链接: http : //haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

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

一些背景

如果你打开这个文件:

 %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 。 这是处理程序注册的名称。 在我的机器上,我find了下面的.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知道如何在AssemblyResourceLoader集中查找embedded文件,以便能够提供(将其发送到客户端,即浏览器)。 例如,在asp.net的网页表单中,如果你使用validation控件,他们依靠一些javascript来显示网页上的错误。 但是,该JavaScriptembedded在程序集中。 浏览器需要JavaScript,所以你会在页面的html中看到这个:

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

AssemblyResourceLoader将使用查询string中的信息findembeddedjavascript的程序集,并返回javascript。


回到问题

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

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

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

这里是一个很好的文章,更详细地解释.axd