【问题标题】:Why Routes.Ignoreroutes("{resource}.axd/{*pathinfo}") not deliberately necessary in webforms?为什么 Routes.Ignoreroutes("{resource}.axd/{*pathinfo}") 在网络表单中不是故意需要的?
【发布时间】:2017-07-13 05:43:32
【问题描述】:
    Routes.Ignoreroutes("{resource}.axd/{*pathinfo}")

故意添加到 Routeconfig 类中以忽略 MVC.NET 中的 scriptresource.axd 或 webresource.axd 。但是为什么我们在 webforms 中不需要这样的声明。我知道我们可以在

中添加这样的语句
     void Application_Start(object sender, EventArgs e) 

但我们不需要在 Webforms 中这样做。或者在 webforms 中添加这样的语句是一个好习惯。

【问题讨论】:

  • 事情就是这样,你应该了解网络表单。 Web 表单中有页面生命周期,而 mvc 没有页面生命周期。它支持请求生命周期。这就是它有路由而网页没有路由的原因。

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


【解决方案1】:

AXD 文件不是真正的文件(存在于物理环境中),它们只是在AssemblyResourceLoader 中注册的别名。默认情况下,ASP.NET 在 HTTP 处理例程提供的内部上下文中使用 ScriptResource.axdWebResource.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.WebResourceSystem.Web.UI.Page.ClientScript.GetWebResourceUrl(this.GetType, [resource path]) 之类的东西),请求AXD 别名可以安全地忽略。

其他参考资料:

Just Where Is WebResource.axd?

What is WebResource.axd?

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2018-06-30
    • 1970-01-01
    • 2014-06-10
    • 2010-09-23
    • 2019-06-11
    • 2015-05-28
    • 1970-01-01
    相关资源
    最近更新 更多