这里不可能把每个管线事件将清楚,但是在整个管线事件中,有两个重要的角色就是HttpHandler和HttpModule。在这些事件中,第10个事件【根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理】 是HttpHandler创建的地方。关于WebForm里面HttpHandler创建的详细过程,这里就不展开说了,如果有兴趣可以参考。
2.2、Asp.net中常见的HttpHandler类型首先还是来看看IHttpHandler的定义
public interface IHttpHandler { ProcessRequest(HttpContext context); IsReusable { get; } }
接口的定义很简单,ProcessRequest()方法里面传一个当前请求的上下文对象去处理当前的http请求。
为了处理异步请求,Framework里面还定义了一个异步的IHttpHandler接口:
public interface IHttpAsyncHandler : IHttpHandler { // Methods IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData); void EndProcessRequest(IAsyncResult result); }
接口的两个方法应该也不难理解。
我们已经说了,HttpHandler的主要作用是处理http请求,原来在做webform的时候应该都写过后缀ashx的一般处理程序吧,这个一般处理程序就是通过实现IHttpHandler接口去实现的。我们是否曾经也写过类似这样的代码,新建一个TestHttpHandler.ashx文件,代码如下:
public class TestHttpHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = ; ]; ]; && password == ) { context.Response.Write(); } else { context.Response.Write(); } } public bool IsReusable { get { return false; } } }
然后运行,通过:16792/TestHttpHandler.ashx?username=admin&password=admin去访问一般处理程序,即可得到正确的结果。
当然,除了这个,还有我们最常见的aspx页面。
TestPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } }
将Page类转到定义:
发现原来Page类也是继承至IHttpHandler,这就是为什么我们可以通过地址:16792/TestPage.aspx来访问这个页面的原因。当然,子类中的ProcessRequest()方法并没有显示的声明出来,因为在Page类里面已经有一个virtue的虚方法,如果需要,你也可以在TestPage这个类里面显示声明:
TestPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } public void ProcessRequest(HttpContext context) { context.Response.Write(); } }
然后你会发现这个时候请求会进到ProcessRequest()方法,而不会进到Page_Load()里面了,至于原因,这和Page类里面的封装有关系。当然这不是本文的重点,本文要说明的是所有实现了IHttpHandler接口的类型都可以在ProcessRequest()方法里面处理当前http请求。
当然,除了ashx和aspx以外,还有一类http的服务接口处理文件asmx也和IHttpHandler有着不可分割的联系,可以说,在asp.net里面,只要是处理Http请求的地方,IHttpHandler几乎“无处不在”。
2.3、自定义HttpHandler。当然,除了上述asp.net自带的HttpHandler之外,我们也可以自定义HttpHandler处理特定的请求。比如我们新建一个TestMyHandler.cs页面:
public class TestMyHandler:IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Response.Write(); //throw new NotImplementedException(); } }
当然,要使用这个自定义的Handler需要在web.config里面加上配置。(PS:这部分是博主后来加上的,所以直接用正确的配置)
这个配置的意思是所有的url以asex结尾的请求都交给TestMyHandler这个类去处理。得到效果:
3、MvcHandler解析