ASP.NET MVC Module

前言

在ASP.NET中管道模型是怎么来实现的?在请求处理流程一文中大概的讲述了Http Module和HttpApplication之间的关系,而并没有涉及到Http Module怎么去实现和注册。Http Module的意义很大,ASP.NET MVC框架怎么捕获请求的?或者换一种方式来说ASP.NET MVC框架的入口点在哪里?

Http Module注册使用

我们直接进入主题来看一下自定义的实现,首先在Module使用之前我们要先定义个Module,定义很简单,定义个类型并且实现IHttpModule接口示例代码1-1

代码1-1

     public class CustomModule:IHttpModule
{
public void Dispose()
{
throw new NotImplementedException();
} public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(context_BeginRequest);
context.EndRequest += new EventHandler(context_EndRequest);
} void context_EndRequest(object sender, EventArgs e)
{
((HttpApplication)sender).Context.Response.Write("<h1>请求处理结束后进入自定义Module</h1>");
} void context_BeginRequest(object sender, EventArgs e)
{
((HttpApplication)sender).Context.Response.Write("<h1>请求处理开始前进入自定义Module</h1><hr>");
}
}

这个时候我们自定义的Module就已经定义好了,在CustomModule类型的 Init()方法中是订阅了HttpApplication的事件,在请求处理流程文中说过,这里不作讲解了。

这个时候运行程序是不行的,ASP.NET有天大的本事也不知道你自己自定义了一个Module的阿,你得告诉它我这有个自定义的Module,运行的时候要执行我的这个Module。

现在我们来把Module注册到系统中,打开项目中的Web.config配置文件,找到<system.web>节点添加<httpModules>节点.

代码1-2

<system.web>
<httpModules>
<add name="MyCustomModule" type="MvcApplication.CustomModule,MvcApplication"/>
</httpModules>
</system.web>

这里要说的是Name属性“MyCustomModule”值只是Module注册到系统的名称,可通过HttpApplication实例对象.Modules["MyCustomModule"]的方式根据Name获取到已经注册到系统中的Module

Type属性值则为自定义的CustomModule类型所在的命名空间已经类型名称,逗号后面的值为CustomModule类型所在的程序集名称。

这个时候还是不能运行程序的,因为博主的示例程序是使用MVC框架的项目,所以要添加一个空的控制器和一个视图。

  1. 右击Controllers文件夹添加->控制器,设置名称为HomeController,设置控制器模板为空控制器,单击确定后,会看到控制器中有个默认的Index()方法。
  2. 右击Index()方法名称,选择添加视图后弹出对话框点击添加即可。
  3. 添加 <h2>自定义Module演示</h2><hr /> 到视图

这样我们再看一下项目的运行结果:

图1

UrlRoutingModule

这里要说的UrlRoutingModule类型就是一个系统定义的Module,为什么要讲解它呢?因为从它里面可以看到系统的扩展点,也因为它是路由系统和MVC框架的连接点。

根据前面的篇幅对于路由的学习,可以说是对路由有了一个基础的认识,大家都知道请求的Url会去匹配系统的定义的路由模式,然后获得一个RouteData这么一个对象实例,然后根据它里面的信息来进行对控制器的生成操作等等后续的一些行为。

我们来看图1来理解UrlRoutingModule的作用,或许在实际项目开发中不会自己去扩展这部分内容,但是多了解一下也没有坏处。

图2

UrlRoutingModule类型的内部大概实现如代码1-3

代码1-3

         void context_PostResolveRequestCache(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
HttpContextWrapper contextWrapper = new HttpContextWrapper(context.Context); RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper); RequestContext requestContext = new RequestContext(contextWrapper, routeData);
IHttpHandler httpHandler = routeData.RouteHandler.GetHttpHandler(requestContext);
httpHandler.ProcessRequest(context.Context);
}

IRouteHandler、IHttpHandler

在上面的代码1-3中,httpHandler变量是通过RouteData对象下的RouteHandler属性里的GetHttpHandler()方法来根据请求上下文对象RequestContext获取的。

这里捎带一句,关于RequestContext类型(不是对象类型,是参数上下文类型)在MVC后续的学习中会经常见到,这也算是一种开发中的模式吧,RequestContext对象中封装了HttpContextBase对象和RouteData对象。

接着刚才的话题,MvcRouteHandler类型已经实现了IRouteHandler类型,细心的朋友在阅读前面的文章会发现,在MVC中注册路由的时候为每个自定义路由规则(也就是Route对象)实例化的时候是用默认的MvcRouteHandler类型,从而会转变到RouteData的RouteHandler属性里,在MvcRouteHandler类型的默认实现里,GetHttpHandler()方法返回的是MvcHandler,然后就像上面所说的那样。在IHttpHandler接口中定义了一个ProcessRequest()方法,这个方法就是MVC框架中请求->路由->控制器的一个过程。这部分内容会在控制器部分说明。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC Module的更多相关文章

  1. ASP.NET MVC 系列随笔汇总[未完待续……]

    ASP.NET MVC 系列随笔汇总[未完待续……] 为了方便大家浏览所以整理一下,有的系列篇幅中不是很全面以后会慢慢的补全的. 学前篇之: ASP.NET MVC学前篇之扩展方法.链式编程 ASP. ...

  2. 一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino

    大半夜的,先说些废话提提神 如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说 ...

  3. 在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录

    在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录 前言 最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1 ...

  4. asp.net MVC 应用程序的生命周期

    下面这篇文章总结了 asp.net MVC 框架程序的生命周期.觉得写得不错,故转载一下. 转载自:http://www.cnblogs.com/yplong/p/5582576.html       ...

  5. ASP.NET MVC实现权限控制

    这篇分享一下 ASP.NET MVC权限控制.也就是说某一用户登录之后,某一个用户是否有权限访问Controller,Action(操作),视图等 想实现这些功能,需要在数据库创建好几个表:[User ...

  6. 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:

    Asp.net MVC中的ViewData与ViewBag ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP. ...

  7. ASP.NET MVC 路由(三)

    ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...

  8. ASP.NET MVC 控制器激活(一)

    ASP.NET MVC 控制器激活(一) 前言 在路由的篇章中讲解了路由的作用,讲着讲着就到了控制器部分了,从本篇开始来讲解MVC中的控制器,控制器是怎么来的?MVC框架对它做了什么?以及前面有的篇幅 ...

  9. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

随机推荐

  1. Python-函数的递归调用

    递归调用顾名思义即在函数内部调用函数(自己调用自己),通常用它来计算阶乘,累加等   注意: - 必须有最后的默认结果 if n ==0,(不能一直调用自己,如果没有可能会造成死循环) - 递归参数必 ...

  2. C# 图片无损压缩

    /// <summary> /// 图像缩略图处理 /// </summary> /// <param name="bytes">图像源数据&l ...

  3. HashMap两种遍历方式的深入研究

    转自:http://swiftlet.net/archives/1259 HashMap的遍历有两种方式,如下所示:第一种利用entrySet的方式:   1 2 3 4 5 6 7 Map map ...

  4. ExecutorService中submit()和execute()的区别

    在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不清submit()和execute()的区别,今天从源码方面分析总结一下. 通常,我们通过Execu ...

  5. Java EE之搭建论坛系统(使用JForum)

    1.下载JForum开源压缩包: 网址:http://jforum.net/  (或者直接使用百度云中的压缩包) 解压,修改解压后文件下的\WEB-INF\config\database\mysql目 ...

  6. 循环遍历checkbox按钮,和点击后提示。

    今天做了一个有关checkbox点击的项目,点击checkbox获取这行的数值,然后相加.运用的是jquery和PHP传值. $('input[type=checkbox]').click(funct ...

  7. C++模板分离

    在正常情况下,c++模板是不允许在头文件声明,在cpp文件中实现.那是因为在cpp文件在编译时内存必须要给它分配储存空间.但是模板本身是一种泛型,在没有明确定义声明类型前,编译器也无法知道它的大小.所 ...

  8. iOS 传值方式

    1.代理传值 2.AppDelegate传值 3.block传值 4.通知传值 5.NSUserDefault传值

  9. Js的typeof和Js的基本数据类型

    本文将从以下几个方面介绍Js的typeof和Js的基本数据类型: ** Js的typeof的用法 ** Js的基本数据类型 ** 使用基本类型使用typeof的返回结果 ** Js的typeof的用法 ...

  10. 【第三课】WEBIX 入门自学-Hello World

    在看官网教程时,入门的例子就是dataTable这个空间.So,遵循官网,一起来看一下入门的DataTable组件: WEB使用时固然是先引入相应的库文件: 代码如下 <html> < ...