zoukankan      html  css  js  c++  java
  • iis6.0与asp.net的运行原理

      这几天上网翻阅了不少前辈们的关于iis和asp.net运行原理的博客,学的有点零零散散,花了好长时间做了一个小结(虽然文字不多,但也花了不少时间呢),鄙人不才,难免有理解不道的地方,还望前辈们不吝赐教。

      这篇博客主要是描述asp.net程序在iis6.0上的一个执行过程。

      执行过程图:

    组件描述

      HTTP.SYS:

        Win2003winXP SP2的核心操作系统组件,,能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。

      优点:

    1. 缓存-静态的内容被缓存于内核模式下,这使服务响应速度更快
    2. 记录(Log-IISLOG功能更快且标准化
    3. 带宽控制
    4. 可靠性-所有的服务请求会在Http.sys里暂存入队列,而不是由服务程序本身来处理,这样,即使服务程序重启,尚未被处理的请求也不会丢失了
    5. 端口重用现在,只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了。

      简单来说它是独立于IIS之外的,任何http请求都会首先被它侦听到

      W3SVC:

           1. 没有第三方应用程序的代码

           2. 根据配置数据的设置创建和监视w3wp.exe,由工作线程运行Web网站应用。

           3. 总是处于运行状态,因此它能够监视Web应用的健康状况,并在必要时采取行动。由于这一策略,服务器能够根据用户指定的参数监视和重新启动应用程序。

      Application Pool(应用程序池):

           1. IIS6.0中,每一个用户web应用程序都会运行在一个应用程序池中。这个应用程序池可以是IIS默认的应用程序池,也可以是用户自定义的应用程序池。

           2.作为一个宿主程序,每个应用程序池中都会运行着一个或者多个用户web应用程序。

           3.在应用程序池中,存在着一个或者多个工作进程(一个以上叫Web)。每个工作进程只能属于一个特定的应用程序池,由这些工作进程来负责管理应用程序池中的用户web应用程序。

      w3wp.exe(工作进程):

      默认情况下,IIS 6.0在工作进程隔离模式下运行,在这种模式中,对于每一个Web应用,IIS 6.0都用一个独立的w3wp.exe的实例来运行它。 因此,工作进程隔离模式不存在          进程内(In-Process)应用程序存在的问题,有效地提高了可靠性和安全性。可靠性的提高是因为一个Web应用的故障不会影响到其他Web应用,也不会影响http.sys,每一        个Web应用由W3SVC单独地监视其健康状况。安全性的提高是由于应用程序不再象IIS 5.0和IIS4.0的进程内应用那样用System帐户运行,默认情况下,w3wp.exe的所有        实例都在一个权限有限的“网络服务”帐户下运行,必要时,还可以将工作进程配置成用其他用户帐户运行。

      Metabase(元数据):

    1. 保存配置数据
    2. 有一个map保存应用程序池和工作进程的数据  

    执行过程

    1. 在客户端(一般指浏览器)输入一个http://www.***.com/default.aspx/
    2. HTTP.SYS首先侦听到请求(静态文件缓存于内核模式下)
    3. W3SVC接收请求,判断是否是静态文件,静态文件直接响应,否则将请求转发给应用程序池的请求队列,从元数据(通过WAS)中查找应用程序池数据,没有则创建
    4. WAS请求传递给应用程序池对应的工作进程,没有就创建(创建时加载ISAPI)
    5. ISAPI会根据ECH创建一个HttpWorkerRequest
    6. 接下来进入应用程序域,由非托管代码变为托管代码(CLR)
    7. HttpRuntime执行ProcessRequest方法产生HttpContext
    8. HttpApplicationFactory执行GetApplicationInstance方法产生HttpApplication
    9. HttpApplication执行一系列事件

    Application暴露出的事件

      1.BeginRequest:asp.net开始处理请求的第一个事件,表示处理的开始。

    2.AuthenticateRequest:验证请求,一般用来取得请求的用户信息。

    3.PostAuthenticateRequest:已经获取请求的用户信息。

    4.AuthorizeRequest:授权,一般用来检查用户的请求是否获得权限。

    5.PostAuthorizeRequest:用户请求已经获得授权。

    6.ResolveRequestCache:获取以前处理缓存的处理结果,如果以前缓存过,那么,不用再进行请求的处理工作,直接返回缓存的结果。

    7.PostResolveRequestCache:已经完成缓存的处理工作。

    8.PostMapRequestHandler:已经根据用户的请求,创建了请求的处理器对象。

    9.AcquireRequestState:取得请求的状态,一般用于session

    10.PostAcquireRequestState:已经获得了session

    11.PreRequestHandlerExecute:准备执行处理程序。

    12.PostRequestHandlerExecute:已经执行了处理程序

    13.ReleaseRequestState:释放请求的状态。

    14.PostReleaseRequestState:已经释放了请求的状态。

    15.UpdateRequestCache:更新缓存。

    16.PostUpdateRequestCache:已经更新了缓存。

    17.LogRequest:请求的日志操作

    18.PostLogRequest:已经完成请求的日志操作。

    19.EndRequest:本次请求处理完成。

  • 相关阅读:
    5-python基础—获取某个目录下的文件列表(适用于任何系统)
    Automated, Self-Service Provisioning of VMs Using HyperForm (Part 1) (使用HyperForm自动配置虚拟机(第1部分)
    CloudStack Support in Apache libcloud(Apache libcloud中对CloudStack支持)
    Deploying MicroProfile-Based Java Apps to Bluemix(将基于MicroProfile的Java应用程序部署到Bluemix)
    Adding Persistent Storage to Red Hat CDK Kit 3.0 (在Red Hat CDK Kit 3.0添加永久性存储)
    Carve Your Laptop Into VMs Using Vagrant(使用Vagran把您笔记本电脑刻录成虚拟机)
    使用Python生成一张用于登陆验证的字符图片
    Jupyter notebook的安装方法
    Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程
    不同时区的换算
  • 原文地址:https://www.cnblogs.com/cheesebar/p/6154666.html
Copyright © 2011-2022 走看看