什么是 routes.IgnoreRoute("resource.axd/*pathInfo")
Posted
技术标签:
【中文标题】什么是 routes.IgnoreRoute("resource.axd/*pathInfo")【英文标题】:What is routes.IgnoreRoute("resource.axd/*pathInfo")什么是 routes.IgnoreRoute("resource.axd/*pathInfo") 【发布时间】:2012-02-19 11:02:03 【问题描述】:什么是routes.IgnoreRoute("resource.axd/*pathInfo")
我在我的项目中找不到任何 .axd 文件,我可以删除此路由规则吗?
【问题讨论】:
【参考方案1】:.axd 文件在物理上不存在。 ASP.NET 在内部使用带有 .axd 扩展名(ScriptResource.axd 和 WebResource.axd)的 URL,它们由 HttpHandler 处理。
因此,您应该保留此规则,以防止 ASP.NET MVC 尝试处理请求,而不是让专用的 HttpHandler 来处理。
【讨论】:
我很确定您希望人们能够下载您网站上的“axd 文件”,因为它们包含 javascript 和样式。 这个答案不正确。之所以将IgnoreRoute
放入MVC 的路由配置中,是为了保证MVC 不会尝试处理请求。这是因为.axd
端点需要由另一个 HTTP 处理程序(一个 不 MVC 一部分的处理程序)处理才能提供脚本。
在 .NET 核心中这完全没有必要吗?我在 Google 上搜索了一个小时左右,但找不到任何关于等效步骤的参考资料,所以我假设它根本不需要。【参考方案2】:
一些背景
如果你打开这个文件:
%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...&t=6342..." type="text/javascript"></script>
AssemblyResourceLoader
将使用查询字符串中的信息找到嵌入 javascript 的程序集并返回 javascript。
回到问题
所以要回答这个问题,什么是:
routes.IgnoreRoute("resource.axd/*pathInfo")
这告诉路由引擎我们不会处理那些匹配该路由模式的请求。换句话说,我们不会处理.axd
请求。为什么?因为 MVC 本身是一个 HttpHandler,类似于 .axd
和 .aspx
以及 web.config 文件中的许多其他处理程序。 MVC 处理程序不知道如何处理请求,例如在程序集中查找嵌入式资源——AssemblyResourceLoader
知道如何处理。 MVC 知道该怎么做,它所做的一切超出了本问答的范围。
【讨论】:
这绝对肯定应该是公认的答案,再加上我的一个。 最后,明确解释 WebResource.axd 的实际作用,同时为问题提供明确的答案。谢谢【参考方案3】:包含模式 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 类的路由。
【讨论】:
【参考方案4】:看看下面的链接: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
【讨论】:
【参考方案5】:这些不是文件(它们不存在于磁盘上)——它们只是一些 HTTP 处理程序注册的名称。
【讨论】:
我想说的最相关的答案。以上是关于什么是 routes.IgnoreRoute("resource.axd/*pathInfo")的主要内容,如果未能解决你的问题,请参考以下文章
MVC route 和 Angular router 单页面的一些方式
nopCommerce 3.9 大波浪系列 之 路由扩展 [多语言Seo的实现]