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. Drools 函数学习

    Drools 函数学习 函数是定义在规则文件当中一代码块,作用是将在规则文件当中若干个规则都会用到的业务操作封装起来,实现业务代码的复用,减少规则编写的工作量.函数的编写位置可以是规则文件当中 pac ...

  2. java微信公众号开发----搭建ngrok环境

    下载ngrok,一个能够在公网安全访问内网Web主机的工具 下载地址:http://download.csdn.net/download/u014252425/9389847,亲测可用 下载完成后,进 ...

  3. 一台电脑安装多个版本的jdk

    我们平时在做Java开发的时候,有时需要使用多个版本的jdk, 那么一台电脑上需要安装多个JDK了. 那一台电脑上可不可以同时安装多个版本的jdk呢? 答案是可以的! 但使用的时候,只能使用一个,不能 ...

  4. Jekyll 安装权限问题 ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/jekyll

    OS X El Capitan 新特性(System Integrity Protection or SIP)中加强了权限,但是可以对这里进行操作 /usr/local/bin 可以尝试使用以下指令进 ...

  5. 单片机与控制实验(5)——重量测量并在LCD12864显示

    一.实验目的和要求 掌握点阵式液晶显示屏的原理和控制方法,掌握点阵字符的显示方法.掌握模拟/数字(A/D)转换方式,进一步掌握使用C51语言编写程序的方法,使用C51语言编写实现重量测量的功能. 二. ...

  6. kafka的log存储解析——topic的分区partition分段segment以及索引等

    转自:http://blog.csdn.net/jewes/article/details/42970799 引言 Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相 ...

  7. Django框架学习

    两个月前学习的Django框架,写了个简易婚恋调查网站,代码就懒得全贴了,有两张图记录下

  8. [XAML]类似WPF绑定的Binding的读取方法

    在WPF的XAML里,依赖属性可以使用基于BindingBase之类的MarkupExtensin 读取XAML时,会自动的把该BindingBase转换为BindingExpressionBase ...

  9. 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)

    原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...

  10. Nonblocking I/O and select()

    This sample program illustrates a server application that uses nonblocking and the select() API. Soc ...