首页 新闻 会员 周边

Asp.Net应用程序的生命周期中的

0
悬赏园豆:100 [已解决问题] 解决于 2014-03-26 09:30

应用程序第一次接到请求时会进入一个宿主对象中,问题:HttpRuntime开始时,HttpContext的HttpRequest、HttpResponse等一系列核心对象是否已存在?跟HttpHandle里的HttpContext是什么关系?    如果不存在,是HttpRuntime创建的HttpContext的一系列对象吗?这时IIS传入的信息又存到哪呢?

anlien的主页 anlien | 初学一级 | 园豆:128
提问于:2014-03-23 08:00
< >
分享
最佳答案
0

w3wp.exe 对应IIS的一个应用程序池,不是应用程序域

 

我觉得理解到ASP.NET应用程序域就可以了,创建IsapiWorkerRequest后,传递给HttpRuntime ,然后由它创建HttpContext(包含HttpResponse,HttpRequest等等)和HttpApplication

收获园豆:50
Yu | 专家六级 |园豆:12980 | 2014-03-23 23:23

只是想知道,一楼的那幅图,现在越看越糊涂了。

应用程序域和宿主对象分别指的是哪些? 又都干了哪些事呢?

anlien | 园豆:128 (初学一级) | 2014-03-24 09:07

@溪流~涓涓:我想应该是

IIS是一个应用程序域,而ASP.NET也是一个应用程序域

两个应用程序域之间的通信则通过宿主对象来完成

Yu | 园豆:12980 (专家六级) | 2014-03-24 21:10

@Yu: 可以理解:应用程序域中的宿主对象封装了IIS传来的对象和相关信息吗?

anlien | 园豆:128 (初学一级) | 2014-03-25 21:47

@溪流~涓涓:简单理解的话 应该说这个 宿主对象 接收了 IIS 传来的信息(如http标头,标体等),然后宿主对象传递给 IsapiWorkerRequest  - HttpRuntime …… ,最后处理后,宿主对象 又输出给 IIS - 客户端

Yu | 园豆:12980 (专家六级) | 2014-03-26 09:16
其他回答(3)
0

不存在,httphandle里面的httpcontext是传递过来的,是httpruntime创建,httpruntime会对数据进行处理

收获园豆:30
我的小花篮 | 园豆:238 (菜鸟二级) | 2014-03-23 09:24

若是HttpRuntime创建的,敢问HttpRequest里的数据是怎么来的?这幅图怎么理解?

矛盾的是:HttpContext是什么时候创建的?

支持(0) 反对(0) anlien | 园豆:128 (初学一级) | 2014-03-23 12:25

@溪流~涓涓:  HttpContext 在httpApplicationFactory之前创建的.

HttpRuntime-->HttpWorkRequest-->HttpContext(HttpRequest,HttpResponse)--->HttpAplicationFactory

HttpAplicationFactory 并没有创建 HttpContext 。

支持(1) 反对(0) 我的小花篮 | 园豆:238 (菜鸟二级) | 2014-03-23 13:03

@我的小花篮: 帮忙看看我回复3楼中的推论,写的是最近我对应用程序生命周期的理解,帮忙看下是否正确。

支持(0) 反对(0) anlien | 园豆:128 (初学一级) | 2014-03-23 15:05

@溪流~涓涓:  

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方法-->构建页面控件树-->开始执行页面生命周期

支持(0) 反对(0) 我的小花篮 | 园豆:238 (菜鸟二级) | 2014-03-23 16:23

@我的小花篮: 那宿主对象是什么?哪些是在宿主对象中发生的?宿主对象的主要功能是干什么呢?

支持(0) 反对(0) anlien | 园豆:128 (初学一级) | 2014-03-24 08:59
0

究的这么细,其实意义不大,按照它的生命周期,HttpMoudle里可以订阅相应事件发生时,执行某方法。HttpHandler可以针对请求文件的扩展名处理不同类型的请求。IIS传入信息不太肯定在你说的这个时候保存在哪儿,但可以肯定,它保存在它创建的这一系统列对象中,在适当的时候会实例化并传给HttpRequest对象。

如果真要究其细节,从书上很难找到答案,还是建议用Reflector来查看System.Web.dll及其它dll的源代码,看看相应代码一定可以找到答案。

收获园豆:10
空明流光 | 园豆:106 (初学一级) | 2014-03-23 12:16

只是想理解下,我也知道也没啥用,就算知道了估计也控制不了。帮忙看下3楼里我的回复好吗?看下合理不。

支持(0) 反对(0) anlien | 园豆:128 (初学一级) | 2014-03-23 15:09
0

可以去看看这篇文章:http://www.cnblogs.com/artech/archive/2009/06/20/1507165.html 

收获园豆:10
袁家小黑球 | 园豆:1045 (小虾三级) | 2014-03-23 12:32

他的博客看一遍了。博客中的描述为:

如果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对象。再后面后面的就不难了。

这个推想不知道是对还是错的?

 

 

支持(0) 反对(0) anlien | 园豆:128 (初学一级) | 2014-03-23 15:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册