客户端往发送的请求到达服务端到服务端响应回客户端的这段时间内,实际上服务器内并不只是简单地对请求进行处理,然后把处理结果响应回去,而是经过一系列多达19个事件之后才能产生最后地处理结果。
因此:其处理的过程就如同一个管道,请求从一端进入,经过一系列事件之后,变成结果响应回去。
了解处理管道:
1.处理管道是所有请求地“必经之路”
2.当一个请求到达处理管道时,服务器会创建一个HttpApplication对象来负责当前整个请求的处理过程
*每一个请求一定会有一个HttpApplication对象陪伴走完管道,因此才能实现统一设计。
实现处理管道:
为了方便学习,首先,先创建3个一般处理程序:
//第一个
public class Handler1 : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; context.Response.Write("<h2>我是Handler1的标签</h2>"); }
//第二个
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; context.Response.Write("<h2>我是Handler2的标签</h2>"); }
//第三个
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; context.Response.Write("<h2>我是Handler3的标签</h2>"); }
解决步骤:
1.自定义一个模块(HttpModule)类
命名规范:XXXModule
2.让模块从IHttpModule接口继承
3.在模块类的Init方法中注册管道的HttpApplication对象的事件
常用的事件:beginRequest endRequest
4.设计事件过程
以上1234综合起来写法如下:
namespace CLGD { public class AppendAuthorModule:IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.EndRequest += context_EndRequest; } void context_EndRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; HttpContext context = app.Context; context.Response.Write("作者是微软工作室"); } } }
5.将设计好的模块注入到处理管道中的相应位置
在配置文件中:
<system.webServer> <modules> <add name="AppendAuthor" type="CLGD.AppendAuthorModule"/> 有意义的名字 模块的命名空间.模块的类名 </modules> </system.webServer>
此示例的结果为每个标签后面都会有个 作者是微软工作室 的文本