【问题标题】:Process Request method in Page Life Cycle页面生命周期中的处理请求方法
【发布时间】:2013-05-21 18:12:10
【问题描述】:

我需要理解以下陈述

声明 - 1

最常见的处理程序是处理 .aspx 文件的 ASP.NET 页面处理程序。当用户请求 .aspx 文件时,该请求由页面通过页面处理程序进行处理。

声明 - 2

您可以自己编写,例如,从数据库而不是网络服务器本身提供图像等,或者编写一个简单的 POX 服务(而不是 SOAP/WCF/等)

声明 - 3

ProcessRequest在页面生命周期中的重要性是什么?

【问题讨论】:

  • 你确定这是一个 MVC 问题吗?

标签: asp.net webforms httphandler


【解决方案1】:

定义

  • HTTP - 允许clients and servers 相互交谈的协议。

  • IIS - Microsoft“网络服务器”。我所说的“网络服务器”是指一个执行三件事的应用程序:侦听传入的 HTTP 请求,处理它们,然后用 HTTP 响应进行回复。

  • ASP.NET - 建立在 .NET 之上的框架,用于为 HTTP 请求创建自定义逻辑。

  • ASP.NET Web Application - 一种 Visual Studio 项目。这些项目主要通过与 Web 服务器(例如 IIS)集成来工作。构建不会创建任何类型的可执行文件。

  • IIS Pipeline - HTTP 请求进入 IIS 后经历的一系列事件。

  • HTTP Handler - 确定对 HTTP 请求的 HTTP 响应的主要逻辑。每个请求只使用一个 HTTP 处理程序。处理程序通常由所请求资源的扩展来选择。例如,如果请求 .jpg、.png 或 .gif(即图像),则处理程序可以简单地返回图像。如果请求 .php 页面,则处理程序可以返回执行 PHP 文件的结果。 IIS 带有自己的本机处理程序。 ASP.NET 添加了这些,还允许您编写自己的自定义处理程序。(例如,IIS 网站上的 list of handlers

IIS 和 ASP.NET Web 应用程序

IIS 和 ASP.NET 之间存在复杂的关系(从这里开始,除非另有说明,否则 ASP.NET 将表示 Web 应用程序)。很难分辨一个从哪里开始,另一个在哪里结束。

也许两者之间最重要的区别在于,虽然 IIS 是一个独立的应用程序,但 ASP.NET 依赖于像 IIS 这样的服务器来运行。这意味着 IIS has 可以选择参与或不参与的几件事(例如路由、身份验证和授权)。

ASP.NET 能够通过定义自己的处理程序和模块来控制将其自定义代码注入 IIS 请求管道的位置。每个模块都使用请求管道事件来参与每个请求。另一方面,处理程序单独工作。只会选择一个来处理请求。

最后一点值得注意的是 IIS 和 ASP.NET 可以在两种不同模式中的一种模式下协同工作,Classic or Integrated。除了说对于这个答案,您所处的模式无关紧要。模式主要影响模块的执行方式。

System.Web.UI.Page 和 IHttpHandler

如前所述,ASP.NET 框架允许您创建自己的处理程序来扩展 IIS。处理程序可以从头开始制作,也可以从 ASP.NET 框架中的预制处理程序继承。

声明 1)最值得注意的预制处理程序是 System.Web.UI.Page。我们可以说这个类是一个处理程序,因为它实现了IHttpHandler。这意味着每次您创建一个继承自 System.Web.UI.Page 的新 aspx 页面时,您都在创建自己的自定义处理程序,该处理程序将处理对该页面的请求并返回正确的 HTML。

语句 2)如果您想从头开始创建处理程序,可以通过在自己的类上实现 IHttpHandler 来实现。这个接口只有一个方法ProcessRequest。当 IIS 需要传递给您的处理程序时,它将调用此方法并为您正在处理的请求传递 HttpContext。

(语句 3) 整个 System.Web.UI.Page 生命周期发生在 Page's ProcessRequest 方法中。如果您使用dotPeek 反编译 System.Web.dll,您可以看到ProcessRequest 所做的一切。一些更值得注意的事情是触发所有 Page 生命周期事件、将所有 WebControl 呈现为 HTML 和 DataBinding。所以,在某种意义上,ProcessRequestPage生命周期(或至少是它的实现)。

【讨论】:

  • 当你请求一个特定的页面时,它的HttpHandler被调用了?这是因为该页面是从HttpHandler 派生的,然后创建了Page 对象?然后调用Page Events?是这样的吗?
  • 其实我正在努力专注于你的陈述 3
  • @PKKG 感谢您的 +1。我不确定我是否完全理解你在问什么。继承自 System.Web.UI.Page 的页面类是处理该页面请求的 HttpHandler。页面没有 HttpHandler,页面 HttpHandler。
  • 我的意思是,在页面生命周期中,流程请求在初始阶段就出现了。对吗?
  • 如果是,HttpHandler创建Page Object,页面事件将由HttpHandler执行。对吗?
【解决方案2】:

为了尽可能让这一点变得平易近人,我将重点介绍 IIS 中使用 ASP.NET WebForms 的基本处理,并重点介绍一些更复杂的细节,例如 HttpModules。其中大部分也适用于 MVC 或 Apache/Mono 环境,但存在一些差异。

当 IIS 接收到一个请求时,它会尝试将它匹配到一个 ISAPI 过滤器来处理它。通常,匹配过程由传入请求的文件扩展名控制。例如,对于 ASP.NET,.aspx 扩展名映射到 .NET ISAPI 过滤器。 .NET ISAPI 过滤器负责处理该请求,并在正常情况下找到正确的 IHttpHandler 实例并调用它以最终为请求提供服务。在 WebForm 的情况下,匹配通常就像将请求的文件的名称与实现它的页面类匹配一样简单。

在 ASP.NET 中,页面通常派生自实现 IHttpHandler 接口的类 System.Web.UI.PageIHttpHandler 只有一个方法,ProcessRequestPage 类为您实现。处理程序不知道页面事件和页面生命周期 - 这些是 Page 类本身的实现细节。关于您在页面生命周期中涉及 HttpHandler 的问题,没有。一旦 ISAPI 过滤器在 IHttpHandler 接口上调用 ProcessRequest 方法,所有其他处理和事件都是 Page 类的结果。

  • 这篇 MSDN 文章虽然已经过时,但对高级页面呈现管道提供了合理的解释。但是请注意,自从撰写本文以来,细节——尤其是关于页面生命周期和事件的细节——已经发生了显着变化。 (感谢 John Saunders 在 cmets 中指出这一点)[Link]

  • 这个问题是HttpHandlers的另一个高级视图[Link]

【讨论】:

  • 请注意,您的第一篇文章来自 2003 年。
  • @JohnSaunders - 公平点。我的目的是对渲染管道进行合理的高级概述,但对于任何深入研究页面周期本身细节的人来说,它是一个糟糕且过时的资源。更新答案以反映这一点。感谢提及。
  • 对不起@JesseSquire:请再给我几天时间。有人在我的帖子上问了另一个问题。每当赏金结束时,我会更新你。
  • 当你请求一个特定的页面时,它的HttpHandler被调用了?这是因为该页面是从HttpHandler 派生的,然后创建了Page 对象?然后调用Page Events?是这样的吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多