AXD 文件不是真正的文件(存在于物理环境中),它们只是在AssemblyResourceLoader 中注册的别名。默认情况下,ASP.NET 在 HTTP 处理例程提供的内部上下文中使用 ScriptResource.axd 和 WebResource.axd。
为了防止将 AXD 请求(即对不存在文件的请求)传递给任何控制器,RouteCollection.IgnoreRoute 将忽略指向这些 AXD 文件的任何请求,这在ASP.NET Routing 文章中有所暗示:
如果您希望路由处理所有请求,即使是该点的请求
到文件,您可以通过设置覆盖默认行为
RouteCollection 对象的 RouteExistingFiles 属性为 true。
当您将此值设置为 true 时,所有与定义的匹配的请求
模式由路由处理。
您还可以指定路由不应处理某些 URL
要求。您可以通过以下方式阻止路由处理某些请求
定义路由并指定 StopRoutingHandler 类
应该用于处理该模式。当请求由
StopRoutingHandler 对象,StopRoutingHandler 对象阻止任何
将请求作为路由进行额外处理。相反,请求
被处理为 ASP.NET 页面、Web 服务或其他 ASP.NET
端点。
因此,如果有人要求,例如example.com/WebResource.axd?d=XXXXX&t=ZZZZZZ,它可能会返回特定程序集文件中任何嵌入资源的特定代码 sn-p,仅由 webforms 使用 - 不在 MVC 中。
如果您正在检查 %Windir%\Microsoft.NET\Framework\[version number]\Config 中的 web.config 文件,则存在 WebResource 和其他类似这样的 AXD 路径:
<httpHandlers>
<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" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False" />
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="False"/>
<add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
...
</httpHandlers>
请注意,Webforms 经常使用 AXD 别名作为来自特定程序集的嵌入式资源容器,这些程序集后来由 ASPX 页面呈现,因为服务器控件利用程序集文件来存储预定义的脚本,以便在页面生命周期中运行。但是,MVC 本身是 HTTP 处理程序,它以类似于 AXD 别名的方式为请求提供服务,并且由于 MVC 直接提取资源文件而不是使用嵌入式资源(在 MVC 中没有调用 System.Web.UI.WebResource 或 System.Web.UI.Page.ClientScript.GetWebResourceUrl(this.GetType, [resource path]) 之类的东西),请求AXD 别名可以安全地忽略。
其他参考资料:
Just Where Is WebResource.axd?
What is WebResource.axd?