应用程序第一次接到请求时会进入一个宿主对象中,问题:HttpRuntime开始时,HttpContext的HttpRequest、HttpResponse等一系列核心对象是否已存在?跟HttpHandle里的HttpContext是什么关系? 如果不存在,是HttpRuntime创建的HttpContext的一系列对象吗?这时IIS传入的信息又存到哪呢?
w3wp.exe 对应IIS的一个应用程序池,不是应用程序域
我觉得理解到ASP.NET应用程序域就可以了,创建IsapiWorkerRequest后,传递给HttpRuntime ,然后由它创建HttpContext(包含HttpResponse,HttpRequest等等)和HttpApplication
只是想知道,一楼的那幅图,现在越看越糊涂了。
应用程序域和宿主对象分别指的是哪些? 又都干了哪些事呢?
@溪流~涓涓:我想应该是
IIS是一个应用程序域,而ASP.NET也是一个应用程序域
两个应用程序域之间的通信则通过宿主对象来完成
@Yu: 可以理解:应用程序域中的宿主对象封装了IIS传来的对象和相关信息吗?
@溪流~涓涓:简单理解的话 应该说这个 宿主对象 接收了 IIS 传来的信息(如http标头,标体等),然后宿主对象传递给 IsapiWorkerRequest - HttpRuntime …… ,最后处理后,宿主对象 又输出给 IIS - 客户端
不存在,httphandle里面的httpcontext是传递过来的,是httpruntime创建,httpruntime会对数据进行处理
若是HttpRuntime创建的,敢问HttpRequest里的数据是怎么来的?这幅图怎么理解?
矛盾的是:HttpContext是什么时候创建的?
@溪流~涓涓: HttpContext 在httpApplicationFactory之前创建的.
HttpRuntime-->HttpWorkRequest-->HttpContext(HttpRequest,HttpResponse)--->HttpAplicationFactory
HttpAplicationFactory 并没有创建 HttpContext 。
@我的小花篮: 帮忙看看我回复3楼中的推论,写的是最近我对应用程序生命周期的理解,帮忙看下是否正确。
@溪流~涓涓:
HTTP.SYS-->AppDomainFactory为该Web应用创建一个应用程序域-->IsapiRuntime(IsapiRuntime会接管该HTTP请求)-->IsapiRuntime会首先创建一个IsapiWorkerRequest对象,用于封装当前的HTTP请求,并将该IsapiWorkerRequest对象传递给ASP.NET运行时HttpRuntime。从此时起,HTTP请求正式进入了ASP.NET管道。HttpRuntime会根据IsapiWorkerRequest对象创建用于表示当前HTTP请求的上下文(Context)对象HttpContext。
随着HttpContext被成功创建,HttpRuntime会利用HttpApplicationFactory创建新的或获取现有的HttpApplication对象之后执行请求管道.在第八个事件创建页面类对象并转成IhttpHandler接口对象,在第11个到12个事件之间执行页面的ProcessRequest方法-->构建页面控件树-->开始执行页面生命周期
@我的小花篮: 那宿主对象是什么?哪些是在宿主对象中发生的?宿主对象的主要功能是干什么呢?
究的这么细,其实意义不大,按照它的生命周期,HttpMoudle里可以订阅相应事件发生时,执行某方法。HttpHandler可以针对请求文件的扩展名处理不同类型的请求。IIS传入信息不太肯定在你说的这个时候保存在哪儿,但可以肯定,它保存在它创建的这一系统列对象中,在适当的时候会实例化并传给HttpRequest对象。
如果真要究其细节,从书上很难找到答案,还是建议用Reflector来查看System.Web.dll及其它dll的源代码,看看相应代码一定可以找到答案。
只是想理解下,我也知道也没啥用,就算知道了估计也控制不了。帮忙看下3楼里我的回复好吗?看下合理不。
可以去看看这篇文章:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html
他的博客看一遍了。博客中的描述为:
如果HTTP.SYS接收到的HTTP请求是对该Web应用的第一次访问,当成功加载了运行时后,会通过AppDomainFactory为该Web应用创建一个应用程序域(AppDomain) 。随后,一个特殊的运行时IsapiRuntime被加载。IsapiRuntime定义在程序集System.Web中,对应的命名空间为System.Web.Hosting。IsapiRuntime会接管该HTTP请求。
IsapiRuntime会首先创建一个IsapiWorkerRequest对象,用于封装当前的HTTP请求,并将该IsapiWorkerRequest对象传递给ASP.NET运行时:HttpRuntime,从此时起,HTTP请求正式进入了ASP.NET管道。根据IsapiWorkerRequest对象,HttpRuntime会创建用于表示当前HTTP请求的上下文(Context)对象:HttpContext。
随着HttpContext被成功创建,HttpRuntime会利用HttpApplicationFactory创建新的或者获取现有的HttpApplication对象。实际上,ASP.NET维护着一个HttpApplication对象池,HttpApplicationFactory从池中选取可用的HttpApplication用户处理HTTP请求,处理完毕后将其释放到对象池中。HttpApplicationFactory负责处理当前的HTTP请求。
上面是我摘的一段,博客我看了几遍。不过有这么一句“对于一个ASP.NET应用来说,HttpApplication派生于global.asax文件,我们可以通过创建global.asax文件对HttpApplication的请求处理行为进行定制。”表一下面第一句。
我想这是错的,因为MSDN上已经有描述了:如果应用程序具有 Global.asax 文件,则 ASP.NET 会创建 Global.asax 类(从 HttpApplication 类派生)的一个实例,并使用该派生类表示应用程序。 我创建了一个项目查看Global.asax文件,发现: public class Global : System.Web.HttpApplication。
我又去瞧瞧MSDN在生命周期中的概述,MSDN有这么一段:当 ASP.NET 接收到对应用程序中任何资源的第一个请求时,名为 ApplicationManager 的类会创建一个应用程序域。 在应用程序域中,将为名为 HostingEnvironment 的类创建一个实例,该实例提供对有关应用程序的信息(如存储该应用程序的文件夹的名称)的访问。,ASP.NET 将创建并初始化核心对象,如 HttpContext、HttpRequest 和 HttpResponse。
我最近也关注了蒋先生,蒋先生的能力那时真高,但蒋先生并没有提MSDN上的内容,估计上面是他看源码理解的吧。在结合最近看的资料,下面是我的理解:
上面标记的我想应该是:通过AppDomainFactory为该Web应用创建一个宿主对象(AppDomain),随后,一个特殊的运行时IsapiRuntime被加载,而这个IsapiRuntime会接管该HTTP请求。
我的猜想是:MSDN上说的应用程序域应该是Worker Process(w3wp.exe),HostingEnvironment包含HttpContext的信息。接着就是,创建了应用程序域并对 HostingEnvironment 对象进行了实例化之后,这时IsapiRuntime会被加载(我想:这是不是创建了宿主对象?),IsapiRuntime会首先创建一个IsapiWorkerRequest对象,用于封装当前的HTTP请求(Ps:应该是用HttpContext对其进行封装吧),并将该IsapiWorkerRequest对象传递给ASP.NET运行时:HttpRuntime。此时:根据IsapiWorkerRequest对象,HttpRuntime会创建用于表示当前HTTP请求的上下文(Context)对象:HttpContext(我的理解:这里并不是正在的创建,而是一个域IsapiWorkerRequest关联罢了,上面回复中的图中,虚线估计表示的就是这个关系。)。
若上面正确:则HttpRuntime得到IsapWorkerRequest对象的引用后,“创建”HttpContext、HttpRequest等核心对象也并不稀奇了。接着HttpRuntime会利用HttpApplicationFactory创建新的或者获取现有的HttpApplication对象。再后面后面的就不难了。
这个推想不知道是对还是错的?