• 管道及页面生命周期


    客户端请求发送到服务器进入管道执行页面生命周期:

      客户发送请求到服务器,服务器通过扩展名扫描映射表,交给对应的扩展程序(aspnet_isapi.dll),扩展程序把请求传入framwork,即调用ISAPIRuntime pr方法,调用HttpRuntime pr方法,会创建HttpWorkerRequest,将请求封装到HttpContext,通过HttpApplicationFactory创建HttpApplication负责处理整个请求--调用pr方法,将HttpContext传入application,进去请求管道。在第8到9个事件间根据HttpContext里的HttpRequest找到被请求报文里的页面路径,根据反射创建页面对象,转成IHttpHandler接口对象。执行11,12事件之间调用前面创建页面的pr方法,同时将上下文传入。执行完后调用FinishRequest方法,生成响应报文,通过HttpWorkerRequest将响应报文发回给扩展程序,交给iis,iis通过套接字将响应报文发给浏览器。

    第8个事件:--PostMapRequestHandler反射创建页面对象,并转成IHttpHandler接口对象。

    第9-11个事件:有一个事件会先尝试将页面类对象转成IRequiresSessionState接口对象,如果转换不成功则不加载session对象,转换成功则从请求报文头中获得Cookie里的sessionid,然后到服务器的session池中找到对应的session对象赋给上下文中的session对象。

    第11-12个事件:执行页面对象pr方法,调用页面FrameWorkInitialize() 调用_buildControlTree()方法打造控件树,执行页面生命周期。将上下文中session对象赋给page对象的session属性。

    _buildControlTree()方法构造控件树

    每个控件都有Controls属性来保存它的子节点

    LoadState:分析请求报文里名为_VIEWSTATE的隐藏域,将里面的字符串反base64编码,然后反序列化还原成集合对象;将其中用户添加的属性存入页面对象的ViewState属性中。同时将服务器端控件的属性值从隐藏域中还原。

    PageLoad

    SaveState:将所有服务器端控件的属性及值保存到ViewState属性中,最后在页面生成html代码的时候,遍历ViewState中的键值集合,然后将里面的序列化,将序列化后的字符串Base64编码生成名为_VIEWSTATE的隐藏域。

    存入response

    遍历控件树,调用每个控件的render方法(传入一个TextWrite对象)从而生成整个页面的html代码,每个控件生成的html代码都按照次序存在了同一个TextWrite中。当执行到HtmlForm表单控件时,此控件的Render方法里会去读取ViewState里的每个键值对,并将他们序列化成字符串,然后进行base64编码得到一个新的字符串,最终生成一个隐藏域存放字符串。

    过滤器

    IHttpModule

    自定义管道

    namespace MyModule

    {

    public class MyTestModule:IHttpModule

    {

    public void Init(HttpApplication context)

    {

    context.BeginRequest+=MyBeginRequest;

    }

    public void MyBeginRequest(object sender,EventArgs e)

    {

    HttpApplication application=sender as HttpApplication;

    application.Context.Response.Write("我是在MyModule里注册到BeginRequest事件上的方法!");

    }

    }

    }

    配置网站web.config节点

    <system.webServer>

    <modules>

    <add name="myModule" type="MyModule.MyTestModule"></add>

    </modules>

    </system.webServer>

    请求管道中的19个事件.

    (1)BeginRequest: 开始处理请求

    (2)AuthenticateRequest授权验证请求,获取用户授权信息

    (3):PostAuthenticateRequest获取成功

    (4): AunthorizeRequest 授权,一般来检查用户是否获得权限

    (5):PostAuthorizeRequest:获得授权

    (6):ResolveRequestCache:获取页面缓存结果

    (7):PostResolveRequestCache 已获取缓存 

    (8):PostMapRequestHandler 创建页面对象

    (9):PostAcquireRequestState 获取Session

    (10)PostAcquireRequestState 获得Session

    (11)PreRequestHandlerExecute:准备执行页面对象

    (12)PostRequestHandlerExecute 执行完页面对象了

    (13)ReleaseRequestState 释放请求状态

    (14)PostReleaseRequestState 已释放请求状态

    (15)UpdateRequestCache 更新缓存

    (16)PostUpdateRequestCache 已更新缓存

    (17)LogRequest 日志记录

    (18)PostLogRequest 已完成日志

    (19)EndRequest 完成

  • 相关阅读:
    /tmp/orbit-oracle/目录inode耗尽
    sp_change_users_login 'Update_One', '用户名', '登录名';
    自动载入Python虚拟环境
    Windows下安装MySQL详细教程
    python版本下载时时,官方目录web-based与executable和embeddable 的区别
    print,printf,println
    大文件文本数据处理
    通过文件指针插入文件内容
    sizeof和strlen的使用
    java八大基本数据类型
  • 原文地址:https://www.cnblogs.com/buzhidaojiaoshenme/p/6831004.html
Copyright © 2020-2023  润新知