ASP.NET
ASP.NET基于.NET Framework的Web开发平台,不但吸收了ASP以前版本的最大优点并参照Java、VB语言的开发优势加入了许多新的特色,同时也修正了以前的ASP版本的运行错误。
ASP.NET就是属于WebForm,也就是平时说的B/S模式的开发。而WinForm就是属于C/S模式。
.NET有很多种语言组成,比如C#、 VB.NET、J#、Jsript、Managed C++,但是都是运行在.NET FrameWork Run Time底下的。
Asp.NET可以用C#或VB.NET来开发。编译后形成CLR,通过服务器的IIS+.NET FrameWork再次编译来运行。
ASP.NET 模型
HTTP请求处理过程
- 客户端浏览器向服务器发出一个http请求,此请求会被inetinfo.exe进程截获,然后转交给aspnet_isapi.dll进程,接着它又通过HttpPipeline的管道,传送给aspnet_wp.exe这个进程,接下来就到了.netframework的HttpRunTime处理中心,处理完毕后就发送给用户浏览器。
- 当一个 http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplicationFactory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:HttpModule–> HttpHandler Factory --> HttpHandler。当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个HttpRequest就被处理完成了,客户端也就得到相应的东东了。
- 完整的http请求在asp.net framework中的处理流程:HttpRequest–>inetinfo.exe->ASPNET_ISAPI.DLL–>HttpPipeline–>ASPNET_WP.EXE–>HttpRuntime–>HttpApplication
Factory–>HttpApplication–>HttpModule–>HttpHandlerFactory–>HttpHandler–>HttpHandler.ProcessRequest()
也就是说一个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给HttpHandler容器。在这个事件之后,HttpModule容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP 请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在 PreRequestHandlerExcute事件之后,HttpModule窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的 HTTP请求处理工作。
而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个 HTTP请求之后,会将控制权交还给HttpModule,HttpModule则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到客户端为止。
PS:红色的HttpApplication实例在HttpModule的Init方法中会用到。
HttpHandler
1、由于HTTP请求有很多种请求类型,比如请求aspx、html、jpg等等。因此,仅仅由HttpApplication直接处理请求时很臃肿的,而且不利于扩展。因此Asp.net采用了抽象工厂模式来处理这些请求。Asp.net在web.config的架构中,允许我们制定某些请求映射到一个HttpHandlerFactory。
所以,我们应该这样理解HttpHanlder:一个HttpHanlder用于响应一类的请求,为一类的请求生成响应结果。
我们经常用到的HttpHanlder有哪些?
- aspx页面。
- asmx服务文件。
- ashx文件(一般处理程序)。
- 实现IHttpHandler接口的自定义类型。
我们通常使用HttpHanlder做什么?
- HttpHanlder类型 实现目标
- aspx页面 响应aspx的请求,输出HTML结果
- asmx服务文件 响应服务调用
- ashx文件(一般处理程序) 实现简单的AJAX响应
- 实现IHttpHandler接口的自定义类 响应什么扩展名的请求?
有时候有些页面需要一些相同的检查功能,比如身份验证。明显使用HttpHandler是不方便的,因为不是所有的页面都需要去调用那些相同的功能。
HttpModule的设计正是提供了一个灵活的方法解决这种功能重用的问题,它采用事件(观察者)的设计模式,将某些HttpHandler都需要的功能抽取出来,形成不同的观察者类型,这些观察者类型可以编译成类库形式,供多个网站共用。
我们用HttpModule做什么事情?
- 修改某些请求(例如前面的示例修改了响应头)。
- 检查检查请求(例如身份认证检查)。
HttpModule能处理哪些请求呢?
- 默认是全部进入ASP.NET的请求。
- 如果只需要处理部分请求,那么请自行判断。
HttpHandler相当于一条水管,HttpModule相当于一小节水管。HttpHandler有很多条,一条流油,一条流水等等。HttpModule相当于一小截,需要过滤的长水管里面都可以装上。