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. tomcat热部署

    tomcat默认支持热部署,修改文件会自动加载部署,不需要重启容器 server.xml配置如下所示 autoDeploy=”true” — 自动部署 reloadable=”true” — 自动加载

  2. Unity中无GC Alloc的CalculateFrustumPlanes

    如果你需要在逻辑层做一些预先的剔除操作,可能需要从MainCamera构建视锥体,然后进行简易相交测试,这时候在unity里面用到的函数接口是CalculateFrustumPlanes: names ...

  3. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  4. SQL Server 2012 新特性

    --Concat示例 ,null,'RTM') --Format实例 DECLARE @d DATETIME = GETDATE(); SELECT FORMAT( @d, 'd', 'en-US' ...

  5. 动态SQL 学习

    <select id="findUser" parameterType="Map" resultType="User">     ...

  6. WebGL入门教程(二)-webgl绘制三角形

    前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...

  7. 贝塞尔曲线(cubic bezier)

    对于css3的Transitions,网上很多介绍,相信大家都比较了解,这里用最简单的方式介绍下: transition语法:transition:<transition-property> ...

  8. 好用的绿色工具(mss2sql,jd-gui)

    1.sql server导入mysql 神器(速度不是一般的快) mss2sql.exe 2.java 反序列化工具 jd-gui.exe

  9. 【转】TCP协议

    TCP是什么? TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一 ...

  10. 单片机与控制实验(2)——LED点阵显示屏

    一.实验目的和要求 了解LED点阵显示的基本原理和实现方法.掌握点阵汉字库的编码和从标准字库中提取汉字编码的方法. 二.实验设备 单片机测控实验系统 LED点阵显示器实验模块 Keil开发环境 STC ...