Asp.net请求处理构架
当一个客户端浏览器对IIS发起访问请求资源时(比如一个.aspx文件),Asp.net会初始化并维护一个包含了多个Response和Request的Http Session 的客户端的连接。一次典型的访问如下图:
上图中,首先,一个请求发到IIS服务器,IIS会检查请求的扩展名,如果是aspx或者ascx文件,IIS会自动匹配到aspnet_isapi.dll来处理这个请求,如果是其他扩展名的文件,IIS会自动匹配到对应ISAPI文件来处理请求。
请求的过程会执行HttpRuntime对象,而HttpRuntiem会利用HttpApplicationFactory对象来确认当前的AppDomain并创建HttpApplication对象来处理请求。Global.asax处理的事件就是基于HttpApplication对象存在的事件。在当前Application中,当前用户的用户信息会通过HttpApplication对象的Context进行访问.接下来执行过程到了HttpModule,任何执行HttpModule的类在这时都会在程序中注册并引发他们的事件。比如Global.asax中的全局事件Session_Start和Session_End事件其实就是SessionStateModule,它实现了HttpModule.所以HttpModule的作用是实行全局的功能.
当HttpModule执行完成后,会到HttpHandler这一块,不同的请求会调用不同的HttpHandler,HttpHandler的执行方法是调用其内部的ProcessRequest()方法,ProcessRequest()方法只有一个参数,参数类型为保存了当前用户状态的HttpContext对象。然后,HttpHandler会负责利用Context.Response.Write()方法来响应当前的请求.
上面的整个处理过程都是利用了Asp.net的对对象,这些对象的关系可以简单用下图表示:
HttpHandler
HttpHandler是Asp.net的处理.aspx和.asmx的构架和方法.HttpHandler允许用户在应用程序处理单个的Url或者相同的扩展名.Asp.net里面有两个Build-in的HttpHandler,如下:
Handler | 描述 |
Asp.net Web Service | 默认用于处理.asmx的HttpHandler |
Asp.net 页面 | 默认用于处理.aspx的HttpHandler |
注意,上面的描述中用了默认,这意味这我们也可以写自己的处理.asmx或.aspx的HttpHandler实现
Asp.net的PageHandlerFactory是用来专门为创建用于被Developer操作的Page实例的,在这个实例中会包含我们常用的用户信息,比如Session,Application,ViewState等…….
通常情况下,HttpHandler可以是异步的,也可以使同步的。
同步的过程是指处理完整个Http请求才返回数据,而异步指处理完请求立刻返回数据.
Asp.net和服务端状态管理
Asp.net服务端状态管理是由我们最熟悉的Application和Session对象组成的,它们以集合的方式将用户信息储存在服务器.
Application是面向全局的,而Session对象是针对特定用户的.这两个对象都可以通过HttpContext对象来进行访问。
HttpContext对象
HttpContext提供了服务端状态管理并实现了HttpApplicationState和HttpSessionState,下面是一些HttpContext对象的属性:
Gets an array of errors accumulated while processing an HTTP request. | ||
Gets the HttpApplicationState object for the current HTTP request. | ||
Gets or sets the HttpApplication object for the current HTTP request. | ||
Gets the Cache object for the current application domain. | ||
Gets or sets the HttpContext object for the current HTTP request. | ||
Gets the first error (if any) accumulated during HTTP request processing. | ||
Gets or sets the IHttpHandler object responsible for processing the HTTP request. | ||
Gets a key/value collection that can be used to organize and share data between an IHttpModule interface and an IHttpHandler interface during an HTTP request. | ||
Gets the IHttpHandler object for the parent handler. | ||
Gets the ProfileBase object for the current user profile. |
服务端状态管理总结
通常情况下,在开发服务器控件时,尽量少用服务端的状态管理,尤其是在能够使用客户端状态管理时,就不要用服务端状态管理。但在一些情况下,客户端浏览器被限制,比如cookies被禁止,这时使用服务端状态管理还是比较方便的J