HTML5技术

MVC系列——MVC源码学习:打造自己的MVC框架(一) - 懒得安分(2)

字号+ 作者:H5之家 来源:H5之家 2016-10-27 13:00 我要评论( )

这里不可能把每个管线事件将清楚,但是在整个管线事件中,有两个重要的角色就是HttpHandler和HttpModule。在这些事件中,第10个事件【根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHa

这里不可能把每个管线事件将清楚,但是在整个管线事件中,有两个重要的角色就是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解析

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 深究angularJS系列 - 初识 - 雨夜羽翼

    深究angularJS系列 - 初识 - 雨夜羽翼

    2016-10-27 11:00

  • Bootstrap框架系列 - 初识 - 雨夜羽翼

    Bootstrap框架系列 - 初识 - 雨夜羽翼

    2016-10-26 16:00

  • Ionic2系列-将beta升级到RC1 - yan_xiaodi

    Ionic2系列-将beta升级到RC1 - yan_xiaodi

    2016-10-19 11:00

  • css3 3d效果及动画学习 - 禾女小姐

    css3 3d效果及动画学习 - 禾女小姐

    2016-10-16 16:00

网友点评