想当初在只使用WebForms框架并以服务端为中心的开发模式时,发现ASP.NET好复杂。一大堆服务端控件,各有各的使用方法,有些控件的事件也很重要,必须在合适地时机去响应,还真有些复杂。后来逐渐发现这些复杂的根源其实就是服务器控件相关的抽象逻辑。随着Ajax越用越多,可能有些人也做过这些事情:【新建一个ashx文件,读取一些用户的输入数据,Form, QueryString,然后调用业务逻辑代码,将处理后的结果序列化成JSON字符串再发给客户端】,这样也能完成一次请求。不知大家有没有做过这类事情,反正我是做过的。慢慢地,我也嫌烦了,这些事情中除了调用业务逻辑部分,都是些体力活嘛。于是想,写点代码把这些事情交给它们去做吧,我只处理与请求有关的数据处理就好了。终于,我写了个简陋的框架,并自称为【我的Ajax服务端框架】以及【我的MVC框架】。写完这些东西后,发现ASP.NET的东西变少了,但是仍可以实现很多功能。
其实,我们可以从另一角度来看ASP.NET,它就是一个底层框架平台,它负责接收HTTP请求(从IIS传入),将请求分配给一个线程,再把请求放到它的处理管道中,由一些其它的【管道事件订阅者】来处理它们,最后将处理结果返回给客户端。而WebForms或者MVC框架,都属于ASP.NET平台上的【管道事件订阅者】而已,Web Service也是哦。如果你不想受限于WebForms或者MVC框架,或者您还想用ASP.NET做点其它的事情,比如:自己的服务框架,就像WebService那样。但希望用其它更简单的序列化方式来减少网络流量,或者还有加密要求。那么了解ASP.NET提供了哪些功能就很有必要了。
本文将站在ASP.NET平台的角度,来看看ASP.NET的一些基础功能。虽然不会涉及任何其它上层框架,但所讲述的内容其实是适合其它上层框架的。
前面我说到:ASP.NET负责接收请求,并将请求分配给一个线程来执行。最终执行什么呢?当然就是我们的处理逻辑。但我们在处理时,用户输入的数据又是从哪里来的呢?只能是HTTP请求。但它又可分为二个部分:请求头和请求体。在ASP.NET中,我们并不需要去分析请求头和请求体,比如:我们可以直接访问QueryString,Form就可以得到用户传过来的数据了,然而QueryString其实是放在请求头上,在请求头上的还有Cookie,Form以及PostFile则放在请求体中。如果对这些内容不清楚的可以参考我的博客:【细说Cookie】和【细说 Form (表单)】。在我这二篇博客中,您应该可以看出:要是让您从请求头请求体中读取这些数据,还是很麻烦的。幸好,ASP.NET做为底层平台,在每次处理请求时,都将这些数据转成方便我们处理的对象了。今天我将只谈这些基础对象以及它们可以实现的功能。
在我的眼里,ASP.NET有三大核心对象:HttpContext, HttpRequest, HttpResponse。
除此之外,还有二个对象虽然称不上核心,但仍然比较重要:HttpRuntime,HttpServerUtility
事实上,这些类的实例在其它的一些类型中也经常被引用到,从出现的频率也可以看出它们的重要性。
中国人喜欢把较重要的东西放在最后,做为压轴出场。今天我也将按照这个风俗习惯做为这些对象的出场顺序来分别说说它们有哪些【重要的功能】。
HttpRuntime
第一个出场的是HttpRuntime,其实这个对象算是整个ASP.NET平台最核心的对象,从名字可以看出它的份量。但它包含的很多方法都不是public类型的,它在整个请求的处理过程中,做了许多默默无闻但非常重要的工作。反而公开的东西并不多,因此需要我们掌握的东西也较少。不能让它做为压轴出场就让它第一个出场吧。这就是我的想法。
HttpRuntime公开了一个方法静态 UnloadAppDomain() ,这个方法可以让我们用代码重新启动网站。通常用于用户通过程序界面修改了一个比较重要的参数,这时需要重启程序了。
HttpRuntime还公开了一个大家