黑马程序员——ASP.NET中HTTP请求处理的过程

来源:互联网 发布:php购物系统源码 编辑:程序博客网 时间:2024/05/21 11:54

 -------Java培训、Android培训、iOS培训、.Net培训期待与您交流! -------

ASP.NET中HTTP请求处理的过程

摘要:初学者对于web应用程序的运行过程刚开始总是感觉云里雾里的,MS又把集成开发环境,框架,做的那么完美,向初学者屏蔽了很多细节,我觉得这是不利于一个程序员的成长的,一下列出我在学习ASP.NET时遇到的迷惑点和我对ASP.NET的理解,希望对当初像我一样有同样迷惑的童鞋有所帮助,少走我以前走过的弯路

1,问:ASP.NET web应用程序的入口点在哪里(我咋找不到main()呢,总感觉失去了对程序的控制力)?
答:IIS可以算是web应用程序的入口点,之所以说可以算是,因为web应用程序的执行时,不止一个进程在工作,IIS是第一启动的进程,后续IIS会启动工作者进程,在工作者进程中会执行页面类的ProcessRequest()方法,页面类继承了IHttpHandler接口,ProcessRequest()方法就是由这个接口提供的。可以看出,我们大部分人的工作都被圈在这么一个实现了IHttpHandler接口的页面类中,对这个类外部的情况却是了解甚少。更详细的解释请继续往下看。


2,问:浏览器能认识都是html,为什么我拖的web服务器控件,浏览器会识别呢,web服务器控件使用C#写的啊?

答:ASP.NET之所以是服务端技术,是因为程序代码在服务器上执行,这些用C#写的服务器端控件,他们执行生成的结果才是html文本,之后服务器把这些html发往客户端的浏览器,浏览器解释html,让我们看到页面。在WebForm的ASPX页面中,甚至即使是我们写的html代码,也会被封装在一个叫literal的服务器控件中。这些工作都是编译器做的,也就是说,我们写的ASPX页面上的文字,本质上都是代码,这些代码执行才会生成html。


3,人家都说ASP.NET应用程序的执行效率慢,我还有必要学吗?为啥jsp执行的那么快呢?

答:大家学习ASP.NET 一般是学习ASP.NET WebForm,WebForm只是ASP.NET的中,一个很重要的开发模型,与它并列的还有MVC,sharePoint,MVP等,webForm之所以执行效率慢,大多是因为ASP.NET程序员专业素质低的原因(您觉得京东,微软他们网站做的怎么样,他们用的是ASP.NET哦),前面我说过,MS向程序员隐藏了很多的WebForm模型的细节,MS为了隐藏这些细节,在服务器上执行的很多的操作,(微软为什么隐藏这些细节呢,为了安全,稳定,提供一个高扩展的架构模型,提高开发效率)这些细节对于专业技能不够硬的程序员来说是没有办法操作的,要操作这些需要对ASP.NET 有非常深的理解,这就构成了ASP.NET初级程序员,想要晋级为中高级成员陡峭的技术壁垒。具体细节不是一两句话能说清楚的,下面我会大致介绍这些细节。jsp之所以效率高,是因为jsp框架相对ASP.NET比较简单,安全问题需要程序员自己来做,也就是说,JSP把安全,稳定等等的活交个了程序员来做(当然程序员也可以不做),而ASP.NET则把这些活按自己的模型全替程序员做好了,干的活多,效率当然要慢了。(因为我对JSP了解不是很深,如果以上见解如有误差,欢迎大家指出)


好了,下面就介绍一下ASP.NET中HTTP请求处理的全过程。具体细节请参看《ASP.NET本质论》

第一阶段( IIS接受请求,转发请求,IIS的进程为inetinfo.exe)
1, IIS得到一个请求;根据请求文件的后缀,查询脚本映射扩展,然后把请求映射到aspnet_isapi.dll文件(一般是根据后缀映射,没有后缀的也可以进行映射)
2, 而aspnet_isapi.dll则会通过一个Http PipeLine的管道,将这个HTTP请求发送给w3wq.exe进程(这就是工作者进程,不同版本的IIS工作者进程可能不一样)


第二阶段(工作者进程运行阶段)

1,当这个HTTP请求进入w3wq.exe进程之后,Asp.Net framework就会通过HttpRuntime类来处理这个HTTP请求。在HttpRuntime的处理中,将经历一个处理管道,(也就是这个处理管道过程被MS做好了影响了ASP.NET的效率,高级的程序员,可以控制这个管道的处理)在这个管道中,会陆续抛出十几个事件,MS会用默认的事件处理程序处理这些事件。这个事件处理就是所谓的模块。陆续抛出的有事件以下列出:
a.BeginRequest
b.AuthenticateRequest
c.AuthorizeRequest
d.ResolveRequestCache
e.AquireRequestState
f.PreRequestHandlerExecute
g.Handler Execution…
h.PostRequestHandlerExecute
i.ReleaseRequestState
j.UpdateRequestCache
k.EndRequest
我们编写的页面就是在g事件中被执行,在这个管道行完成后,将会陆续退回IIS,由IIS 将执行的结果(html)发送到客户端浏览器。


主要名词解析

HttpRuntime:配置 ASP.NET HTTP 运行时设置,这些设置确定如何处理对 ASP.NET 应用程序的请求,HttpRuntime类几乎包含了单个HTTP请求的所有信息,HttpRuntime是HTTP管道的入口。HTTP请求到达时,ASP.NET 将运行时库加载到要处理请求的进程中,还为将在 Web 服务器上运行的每个 Web 应用程序创建一个应用程序域(AppDomain)。HttpRuntime的ProcessRequest 方法驱动所有后续的 ASP.NET WEB处理。


AppDomain:AppDomain对象表示应用程序域,即一个应用程序执行的独立环境,为执行托管代码提供隔离、卸载和安全边界。它是是微软基于.NET框架设计的概念,找不到其他技术体系中贴切的参照概念。辅助进程为每个当前正在运行的ASP.NET应用程序维护一个特定的AppDomain。一个进程中可以有多个AppDomain,但是一个AppDomain只能存在于某个进程中。线程执行可以涉及多个AppDomain,但某个特定时刻线程仅存在于一个AppDomain中,且线程可以进入其他的AppDomain。


HttpModule:实现了System.Web.IhttpModule接口的.NET组件。这些组件通过在某些事件中注册,把自己插入ASP.NET请求处理管道中(HttpApplication事件链)。当这些事件(HttpApplication对象触发的事件)发生时,HttpModule就会去处理事件(一般是截获请求),所以HttpModule本质上就是过滤器(当一个HTTP请求到达HttpModule时,整个ASP.NET Framework并未对这个HTTP请求做过任何处理)。HttpModule有访问HttpContext对象的权限(但某些对象可能还不能使用),可以修改请求,输出响应的内容以及提供自定义的身份验证,另外还可以在特定的程序里,针对ASP.NET的每一个请求提供响应前处理和响应后处理。多个HttpModule可以钩住相同的事件,事件被处理的顺序是它们在web.config里配置的顺序。


HttpHandler:HttpHandler(HTTP处理器)是HTTP请求的处理中心,它可以完全使用HttpContext对象,真正地对客户端请求的页面进行编译和执行,并将处理后的信息附加在HTTP请求信息流中返回到HttpModule中。HttpHandler通过一个简单IHttpHandler接口实现(或者它的异步版本IHttpAsyncHandler),此接口仅仅只有一个方法ProcessRequest()和一个属性IsReusable。


0 0
原创粉丝点击