我爱电脑技术论坛's Archiver

bbs23 发表于 2008-5-14 09:53

Asp.Net页面执行流程分析

在我的上一篇文章中说到了HttpModule、HttpHandle的简单使用,我们可以利用它们在页面请求的过程中加入自己的事件处理程序。那么在一个aspx页面请求时后台到底做了什么?当然asp.net做了很多事情,过程也比较复杂,本文主要分析一下大体的流程。 gCg7Y&geS8T` X

gz7h|1K7a_ 总体流程如下:z[.u'hSFz
请求一个页面时首先被WWW服务截获(inetinfo.exe进程),这个进程首先判断页面的后缀,然后根据IIS中的配置来决定调用哪个扩展程序,比如aspx的页面就会调用c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll,aspnet_isapi.dll将请求发送给w3wp.exe进程(我们在调试IIS中网站时就是把VS2005附加到这个进程上的)。
AT7y/}iX v ,F^:p&TB
接下来w3wp.exe进程就会调用.net类库进行具体处理:&M`}3h B2Y/R }^Y7`
下面只是列出主要流程,如果喜欢钻研的同学可以用Reflector去查看 },f3r-M{
一:ISAPIRuntimeO'G#J*pr0G&~'@
bool useOOP = iWRType == 1;
rh]0b[v6M M wr = ISAPIWorkerRequest.CreateWorkerRequest(ecb, useOOP);
_2~(u0S"RKCj wr.Initialize(); Q%m1Oo%P)V%R#w)[;Q3S B
string appPathTranslated = wr.GetAppPathTranslated();
S] zT~ h-Lag*f string appDomainAppPathInternal = HttpRuntime.AppDomainAppPathInternal; @[,D9nP!Z
if ((appDomainAppPathInternal == null) || StringUtil.EqualsIgnoreCase(appPathTranslated, appDomainAppPathInternal))
k,J%Z`%O&Wi` {{7Zq&L }A9^v'~
HttpRuntime.ProcessRequestNoDemand(wr);
Y f(Ap-@.SzG R return 0;
5k$o:bi*W1I5\ }
\7Vl3i"K7`@3p-f(ge HttpRuntime.ShutdownAppDomain(ApplicationShutdownReason.PhysicalApplicationPathChanged, SR.GetString("Hosting_Phys_Path_Changed", new object[] { appDomainAppPathInternal, appPathTranslated }));
*Xq8E`!w2B:ArT return 1; M'z)tW\9I-RK
它的主要作用是调用一些非托管代码生成HttpWorkerRequest对象,该对象包含当前请求的所有信息,然后传递给HttpRuntime,这里生成的HttpWorkerRequest对象可以直接在我们的页面中调用的,通过它取得原始的请求信息:1r} @`3lV\\5V
IServiceProvider provider = (IServiceProvider)HttpContext.Current;
K-F/b6O8g'h HttpWorkerRequest wr = (HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); !V:^V @ z6XZm

9e"_f:N.^]!hi S 二:HttpRuntime
+gZDEF(W 最主要的就是private void ProcessRequestInternal(HttpWorkerRequest wr)方法: context = new HttpContext(wr, false); 1B8E'sb/k&v i(}
4ZT!dz:_/@h"k x
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);
&H!h$iB c
s%I%~#s!A IHttpAsyncHandler handler2 = (IHttpAsyncHandler) applicationInstance;
w:o@*k*g S context.AsyncAppHandler = handler2;
-W"RSs%d%Vn handler2.BeginProcessRequest(context, this._handlerCompletionCallback, context);
]b"no8iM 1、根据HttpWorkerRequest对象生成HttpContext,HttpContext应该大家都很熟悉的,它包含request、response等属性,在页面中经常会用到的;
t T6to@0G \#W g4} 2、调用HttpApplicationFactory来生成IHttpHandler(这里生成的是一个默认的HttpApplication对象,HttpApplication也是IHttpHandler接口的一个实现)]9fv\oS
3、调用HttpApplication对象执行请求
:M/y2G A)|X-@ 三:HttpApplicationFactory
$s2G$[8q2\6zB(qIa 正如2.2中所提到的,这里主要是生成一个HttpApplication对象:
9aW!@j:mo]*u e;UR;C,_3hG+An6h y
'RZ]L+PA-~&~4V
internal static string GetApplicationFile()@Jno5y-G5u"`
{
3t6y!I1_7`wI return Path.Combine(HttpRuntime.AppDomainAppPathInternal, "global.asax"); D"sr y.Im1b
}|eY"i^'aB]t)~
首先会查看是否存在global.asax文件,如果有的话就用它来生成HttpApplication对象,从这里我们可以看到global.asax的文件名是在asp.net的框架中写死的,不能修改的。如果这个文件不存在就使用默认的对象。oS DLj&[!OoQ4|
I0w*Wj)l!q
ISAPIRuntime-->HttpRuntime-->HttpApplicationFactory-->HttpApplication-->HttpModule--HttpHandlerFactory-->HttpHandler 这也是本文主要分析的地方。

页: [1]

Powered by 我爱电脑技术论坛 Archiver 6.1.0  © 2001-2007 本SEO插件由网络人站长论坛出品