6

我需要理解以下陈述

声明 - 1

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

声明 - 2

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

声明 - 3

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

4

2 回答 2

12

定义

  • HTTP - 一种允许客户端和服务器相互通信的协议。

  • IIS——微软的“网络服务器”。“网络服务器”是指一个应用程序,它做三件事:监听传入的 HTTP 请求,处理它们,然后回复一个 HTTP 响应。

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

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

客户端、HTTP 和 IIS

  • IIS 管道- HTTP 请求进入 IIS 后经过的一系列事件。

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

IIS 和 ASP.NET Web 应用程序

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

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

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

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

IIS、模块和处理程序

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 的 ProcessRequest方法中。如果您使用dotPeek反编译 System.Web.dll,您可以看到ProcessRequest所做的一切。一些更值得注意的事情是触发所有 Page 生命周期事件、将所有 WebControl 呈现为 HTML 和 DataBinding。因此,从某种意义上说,ProcessRequest Page生命周期(或至少是它的实现)。

于 2013-06-30T02:15:47.500 回答
5

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

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

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

  • 这篇 MSDN 文章虽然已经过时,但对高级页面渲染管道提供了合理的解释。但是请注意,自从撰写本文以来,细节——尤其是关于页面生命周期和事件的细节——已经发生了显着变化。(感谢约翰桑德斯在评论中指出) [链接]

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

于 2013-05-21T18:43:13.827 回答