您的位置:首页 > 理论基础 > 计算机网络

服务器端技术----Http请求的处理过程

2009-06-17 16:00 477 查看
Http请求的处理过程

Http请求首先到达Web Server,Web Server可以是IIS、Appache等,这些服务器都可以有自己的具有一定接口的扩展来增强其功能,其中IIS使用ISAPI扩展来增强功能,Asp.net就是ISAPI扩展的一种。

IIS是使用被请求的资源的扩展名来决定使用哪个ISAPI扩展来处理该请求的,所以如果需要让某一扩展名的资源被Asp.net处理,就需要在IIS里配置该扩展名与c:/windows/microsoft.net/framework/v2.0.50727/aspnet_isapi.dll进行映射,还包括请求的类型(Get、Post等)。

Http请求会通过若干个HttpModules(其中一个是SessionStateModule,用于管理会话状态)和一个HttpHandler来处理,具体的HttpHandler可以在Web.config里配置,任何实现了IHttpHandler接口的类都可以在Web.config文件里配置为一个HttpHandler来处理Http请求,如果是用ashx文件来实现则会自动配置,不需要在Web.config里进行配置。

IHttpModule接口有两个方法:Init()和Dispose(),HttpModule一般是采用在Init里进行事件绑定的方式来处理HttpApplication的某个事件,典型应用有身份验证AuthenticateRequest等。HttpHandler是可以配置成处理有特定扩展名资源的处理程序,它和Web Page有两个区别,就是不用Response.ClearContent(),直接设置Response.ContentType并Write就可以了,可以使程序员专注于代码逻辑的编写,然后是在需要访问Session的时候需要实现IRequiresSessionState接口。

如果有多个HttpModule里都处理了Application_BeginRequest事件,则不一定每个都执行,因为当某一个执行Application_BeginRequest出现异常的时候,后面的几个都不会再执行Application_BeginRequest,但是它们如果有Application_EndRequest就都会被执行,因为需要释放资源。

IHttpHandler接口有两个成员:IsReusable和ProcessRequest()。

IHttpHandlerFactory接口有两个成员:GetHandler()和ReleaseHandler(),实现这个接口的类可以在Web.config里配置成HttpHandler工厂,把HttpRequest路由到合适的Handler。

如果请求的资源是一个aspx页,那么先看该页是否被编译,如果没有,则先编译它,再用它的一个实例来处理请求。在编译该页之前,会先编译top-level items,如App_GlobalResources、App_WebResources、Profile properties defined in the Web.config file、App_Code、Global.asax。当这些执行完,就会根据处理该请求的需要编译Folders、Pages和其它需要的项目。

注意top-level items只会编译一次,只有在它们依赖的东西如Web.config发生了改变的时候才重新编译。

被编译的Assembly会被Cache在Server,所以除了第一次请求会等较长的编译时间外,以后的请求都会很快,当然也可以预编译,让第一次请求也很快。

1.IIS是使用请求的文件扩展名来与ISAPI扩展进行映射的,这是可配置的。Asp.net就是ISAPI Extension的一种,能够处理.aspx, .ascx, .ashx, and .asmx等。当需要某自定义扩展名的资源受Asp.net处理的时候就要映射一下扩展名和Aspnet_isapi.dll。

2.当第一次请求到来时,ApplicationManager会创建一个应用程序域Application Domain,应用程序域为全局变量提供应用程序之间的隔离,并可以使每个应用程序被单独的卸载。在应用程序域里,HostingEnvironment实例被创建,它提供对应用程序信息的访问,比如存储应用程序的文件夹名。

3.当Application Domain创建完成并且HostingEnvironment被实例化之后,Asp.net创建和初始化Core Object,比如HttpContext、HttpRequest、HttpResponse。HttpContext包含特定于当前应用程序请求的对象,比如HttpRequest、HttpResponse,HttpRequest包含有关当前请求的信息,包括Cookie和浏览器信息,HttpResponse包含发送到浏览器的回应,包括所有的呈现输出和Cookie。

4.给Request指定Application对象。当所有的Core Objects被初始化之后,应用程序就开始于一个HttpApplication对象的创建,HttpApplication对象是Reusable的,即第一次请求的时候是创建,以后的请求都使用第一次创建的对象。当应用程序有Global.asax文件时,Asp.net就会创建一个继承于HttpApplication类的Global.asax实例,并使用这个派生类来处理应用程序。当Application类创建后,所有配置的HttpModules也都被创建,然后Application的Init()被调用。

HttpApplication对象的事件发生顺序为:

首先会ValidateRequest,看是否有potentially malicious markup。

然后看Web.config文件里是否配置了UrlMappingsSection,有就执行Url Mapping。

最后执行下面的:

1.BeginRequest
2.AuthenticateRequest - PostAuthenticateRequest
4.AuthorizeRequest - PostAuthorizeRequest
6.ResolveRequestCache - PostResolveRequestCache

然后根据配置文件里的扩展名与Handler的映射来选择一个适合的Handler,或者根据HandlerFactory来选择一个合适的Handler,去处理请求。如果请求的是一个WebPage,而该页又需要被编译,Asp.net就会在生成这个页的实例之前编译这个页。

8.PostMapRequestHandler
9.AcquireRequestState - PostAcquireRequestState
11.PreRequestHandlerExecute

然后会调用调用适当HttpHandler类的ProcessRequest()方法,如果是异步的,则会调用BeginProcessRequest()方法。例如如果请求一个WebPage,则由该Page的一个实例来处理这个Request。

12. PostRequestHandlerExecute
13.ReleaseRequestState - PostReleaseRequestState

然后如果Filter属性被定义了,就会执行ResponseFiltering。

15.UpdateRequestCache - PostUpdateRequestCache
17.LogRequest - PostLogRequest
19.EndRequest
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: