页面生命周期中的进程请求方法

时间:2013-05-21 18:12:11

标签: asp.net webforms httphandler

我需要理解以下陈述

声明 - 1

  

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

声明 - 2

  

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

声明 - 3

  

ProcessRequest在Page Life Cycle中的重要性是什么?

2 个答案:

答案 0 :(得分:11)

解释

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

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

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

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

Client, HTTP, and 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可以选择参与或不参与。

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

最后值得注意的是,IIS和ASP.NET可以在两种不同模式之一Classic or Integrated中协同工作。除了说这个答案与你所处的模式无关外,我不会在这里有所区别。这些模式主要影响模块的执行方式。

IIS, Modules, and Handler

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。因此,从某种意义上说,ProcessRequest Page生命周期(或者至少是它的实现)。

答案 1 :(得分: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接口的类IHttpHandlerIHttpHandler只有一个ProcessRequest类为您实现的方法Page。处理程序不知道页面事件和页面生命周期 - 这些是Page类本身的实现细节。关于您在页面生命周期中涉及HttpHandler的问题,没有。一旦ISAPI过滤器调用ProcessRequest接口上的IHttpHandler方法,所有其他处理和事件都是Page类的结果。

  • 这篇MSDN文章虽然过时,却提供了对高级页面呈现管道的合理解释。但请注意,自撰写本文以来,详细信息(尤其是页面生命周期和事件)已经发生了重大变化。 (感谢John Saunders在评论中提到这一点)[Link]

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