【问题标题】:What is routes.IgnoreRoute("{resource}.axd/{*pathInfo}")什么是 routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
【发布时间】:2012-02-19 11:02:03
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


    【解决方案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...&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 知道该怎么做,它所做的一切超出了本问答的范围。

    【讨论】:

    • 这绝对肯定应该是公认的答案,再加上我的一个。
    • 最后,明确解释 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】:
      【解决方案5】:

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

      【讨论】:

      • 我想说的最相关的答案。
      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多