【问题标题】:Who executes first in ASP.Net MVC Pipeline?谁在 ASP.Net MVC 管道中首先执行?
【发布时间】:2015-10-15 17:52:11
【问题描述】:

我对 IIS 7.0 中如何处理请求的理解如下:

  1. 当请求进入 IIS 时,URLRoutingModule 会处理它。
  2. 如果ÙRLRoutingModule 找到一个无扩展名的 URL(即在RouteTable 内),则它会映射到相应的控制器。

但是,我找不到以下问题的答案。

  1. 之前研究过aspnet_isapi.dll处理所有ASP.NET相关的活动。那么,在 HTTP 管道中,哪个首先执行? [URLRoutingModule or ASPNET_ISAPI.DLL]

  2. ASPNET_ISAPI.DLLHTTP Handler 还是 ISAPI Extension

(我读过http handler 可以通过派生自IHttpHandler 来实现,而要编写isapi extension 我们需要C/C++ 中的非托管代码)

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 iis


    【解决方案1】:

    在 HTTP 管道中,哪个先执行? [URLRoutingModule 或 ASPNET_ISAPI.DLL]

    ASPNET_ISAPI.DLL 首先被执行。它将控制权转移到托管的 ASP.NET 运行时并根据需要调用 URLRoutingModule

    ASPNET_ISAPI.DLL 是 HTTP 处理程序还是 ISAPI 扩展?

    这是一个 ISAPI 扩展:

    来自MSDN

    ASP.NET 功能包含在名为 Aspnet_isapi.dll 的 ISAPI dll 中。

    HTTP 处理程序是由 ASP.NET 运行时调用的托管处理程序。

    来自HTTP Handlers and HTTP Modules Overview

    ASP.NET HTTP 处理程序是响应对 ASP.NET Web 应用程序发出的请求而运行的进程(通常称为“端点”)。

    【讨论】:

    • @D Stanley:但是等等。 ÀSPNET_ISAPI.dll 似乎处理请求并生成响应。因此,它遵循 HTTP Handler 的相同定义,为什么不将其称为 HTTP Handler
    • @nowhewhomustnotbenamed。我假设“HTTP 处理程序”是指 managed HTTP 处理程序。这些由 ASP.NET 运行时调用,由ASPNET_ISAPI.DLL 调用,由 IIS 调用。
    • 太棒了。但这意味着,如果首先处理 .ASPX 页面(由管道中的 ASPNET_ISAPI.dll 处理),则 .ASPX 页面的渲染速度比 MVC 页面快?
    • 我相信ASPX的请求仍然会通过路由模块,但是它们是直接处理的,而不是将URL解码成控制器和动作。因此,它可能会比等效的 MVC 页面更快地呈现 ,但它应该是不易察觉的。如果这就是你要去的地方,我当然不会以此为理由使用 ASPX 而不是 MVC。
    【解决方案2】:

    ASPNET_ISAPI.DLL 是一个 ISAPI 扩展。这些扩展是在 IIS 中注册的组件(DLL、脚本、可执行文件)。每个扩展都注册为处理特定请求,因为 IIS 本身处理的请求很少。例如,注册名称扩展以处理所有标识为 ASP.NET 相关的请求。

    ISAPI 过滤器是用于在 IIS 管理请求的方式中添加一些行为的 DLL。它们会监听所有传入的请求,直到找到可以处理的请求。

    请注意,上面的两个概念是为 IIS 定义的。 HttpModules 和 HttpHandlers 是不同的。

    HttpModules 和 HttpHandlers 是纯粹的 ASP.NET 对象,因此与它们相关的所有事情都发生在 IIS 处理对 ASP.NET 管道的请求之后。然而,它们在 ASP.NET 中的角色类似于 IIS 中的角色 - 处理程序处理特定请求,模块拦截所有请求并处理其配置中指定的一些请求。

    URLRoutingModule 是一个标准的 HttpModule,因此它会拦截处理到 ASP.NET 的请求,如果其中注册的任何路由与请求匹配,则触发相应的 HttpHandler。 ASp.NET MVC 的默认处理程序是 MvcRouteHandler,然后使用 MVC 触发与控制器相关的活动。

    一些进一步阅读的链接:

    【讨论】:

    • 很好的解释。谢谢你。所以,ISAPI ExtensionsHTTP Handlers 非常相似,ISAPI FiltersHttp Modules 相似,只是前者是非托管的。我的理解正确吗,安德烈?
    • 对,虽然另一个显着的区别是 ISAPI* 存在于 IIS 级别,而 HttpModule/handler 仅是 ASP.NET 级别。前者首先发挥作用
    • 哦,好吧。因此,首先调用 ASPNET_ISAPI,然后如果找不到 .aspx,则转到 URLRoutingModule
    • URLRoutingModule 是一个模块,它拦截所有对 asp.net 的请求,不管 .aspx 是否存在。但是,如果路由没有在 iis 中托管的任何 mvc 应用程序中注册,则此模块不会将执行传递给其中任何一个,并将让请求遵循标准的 ASP.NET 管道。请参阅答案中的链接 5,其中对此进行了更详细的解释
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多