为什么Rouforms.Ignoreroutes(" {resource} .axd / {* pathinfo}")在webforms中没有刻意的必要?

时间:2017-07-13 05:43:33

标签: c# asp.net asp.net-mvc webforms

     void Application_Start(object sender, EventArgs e) 
故意在Routeconfig类中添加

以忽略MVC.NET中的scriptresource.axd或webresource.axd。但是为什么我们不需要在webforms中使用这样的语句。我知道我们可以在

中添加这样的陈述
multi-select.js

但我们不需要在Webforms中这样做。或者在webforms中添加此类语句是一种很好的做法。

1 个答案:

答案 0 :(得分:2)

AXD文件不是真实文件(存在于物理上下文中),它们只是AssemblyResourceLoader中的注册别名。 ASP.NET默认使用ScriptResource.axd& HTTP处理例程提供的内部上下文中的WebResource.axd

为防止将AXD请求(即对不存在的文件的请求)传递给任何控制器,RouteCollection.IgnoreRoute将忽略指向这些AXD文件的任何请求,ASP.NET Routing文章中暗示:

  

如果您希望路由处理所有请求,甚至是指向的请求   对于文件,您可以通过设置来覆盖默认行为   RouteExistingFiles对象的RouteCollection属性为true。   将此值设置为true时,将匹配已定义的所有请求   模式由路由处理。

     

您还可以指定路由不应处理某些URL   要求。您可以阻止路由处理某些请求   定义路由并指定StopRoutingHandler类   应该用来处理这种模式。当请求由a处理时   StopRoutingHandler对象,StopRoutingHandler对象阻止任何对象   将请求作为路由进行额外处理。相反,请求   被处理为ASP.NET页面,Web服务或其他ASP.NET   端点。

因此,如果有人请求,例如example.com/WebResource.axd?d=XXXXX&t=ZZZZZZ,它可能会返回某个程序集文件中任何嵌入资源的特定代码段,仅由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.WebResourceSystem.Web.UI.Page.ClientScript.GetWebResourceUrl(this.GetType, [resource path])这样的事情),可以安全地忽略对AXD别名的请求。

其他参考资料:

Just Where Is WebResource.axd?

What is WebResource.axd?