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

 1     public class CustomModule:IHttpModule
 2     {
 3         public void Dispose()
 4         {
 5             throw new NotImplementedException();
 6         }
 7
 8         public void Init(HttpApplication context)
 9         {
10             context.BeginRequest += new EventHandler(context_BeginRequest);
11             context.EndRequest += new EventHandler(context_EndRequest);
12         }
13
14         void context_EndRequest(object sender, EventArgs e)
15         {
16             ((HttpApplication)sender).Context.Response.Write("<h1>请求处理结束后进入自定义Module</h1>");
17         }
18
19         void context_BeginRequest(object sender, EventArgs e)
20         {
21             ((HttpApplication)sender).Context.Response.Write("<h1>请求处理开始前进入自定义Module</h1><hr>");
22         }
23     }

这个时候我们自定义的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

 1         void context_PostResolveRequestCache(object sender, EventArgs e)
 2         {
 3             HttpApplication context = sender as HttpApplication;
 4             HttpContextWrapper contextWrapper = new HttpContextWrapper(context.Context);
 5
 6             RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper);
 7
 8             RequestContext requestContext = new RequestContext(contextWrapper, routeData);
 9             IHttpHandler httpHandler = routeData.RouteHandler.GetHttpHandler(requestContext);
10             httpHandler.ProcessRequest(context.Context);
11         }

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://blog.csdn.net/jinyuan0829

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

ASP.NET MVC Module,布布扣,bubuko.com

时间: 2024-07-31 14:33:39

ASP.NET MVC Module的相关文章

Asp.Net MVC EF各版本区别

2009年發行ASP.NET MVC 1.0版 2010年發行ASP.NET MVC 2.0版,VS2010 2011年發行ASP.NET MVC 3.0版+EF4,需要.Net4.0支持,VS2011 2012年發行ASP.NET MVC 4.0版+EF5,需要.Net4.0支持,VS2012 2013年發行ASP.NET MVC 5.0版+EF6,需要.Net4.5支持,VS2013 2015年發行ASP.NET MVC 6.0版+EF7,需要.Net5.0支持,VS2015 ASP.NET

Asp.net MVC中的ViewData与ViewBag

在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从Asp.net MVC 1 就有了 ASP.NET MVC3 才有 基于Asp.net 3.5 framework 基于Asp.net 4.0与.net framework ViewData比ViewBag快 ViewBag比ViewData慢 在ViewPage中查询数据时需要转换合适的类型 在V

ASP.NET MVC 原理

我出了份卷子做面试题,其中之一就是要求说说ASP.NET MVC的原理.感觉太空泛了,谁能说得准呢? 但是,如果站在我这个面试官立场,面试题好多时并不要求有标准答案,可能也没有什么标准答案,主要是通过问答,了解一下面试者的理解程度,相关知识程度什么的.其实,我自己水平也不行,但因为年纪大,好像不带点人大家会觉得有点怪怪的,所以过去一段时间也参与点招聘工作. 对于ASP.NET MVC,我自己的理解是酱紫的: MVC是一种思想.ASP.NET MVC只不过是实现了这种思想的一种开发框架.利用Web

ASP.NET MVC file download sample

ylbtech- ASP.NET MVC:ASP.NET MVC file download sample 功能描述:ASP.NET MVC file download sample 2,TechnologyAndTheEnvironment(技术与环境) 操作系统: windows 开发语言: C# 开发框架: ASP.NET MVC 数据库: 开发软件: Microsoft Visual Studio 2010  开发技术 ASP.NET MVC 3,DatabaseDesign(数据库设计

详解ASP.NET MVC的请求生命周期

本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为asp.net mvc是一个扩展性非常强的框架.例如,我们可以插入不同的viewengine来控制网站内容呈现的方式.我们还可以定义控制器生成和分配到某个请求的 方式.因为我想发掘任何asp.net mvc页面请求的扩展点,所以我要来探究请求过程中的一些步骤. 其次,如果你对测

ASP.NET MVC 编程参考

ASP.NET MVC 编程参考 转载请注明出处:http://surfsky.cnblogs.com MVC    参考 http://msdn.microsoft.com/zh-cn/dd408813.aspx    MVC 的基本思想        ·Module      : 模型.可以看做实体类,可用各种技术实现,例如Microsoft Entity Framework.NHibernate等        ·View        : 视图.可以与某个实体类关联,此时视图则负责展示该

ABP示例程序-使用AngularJs,ASP.NET MVC,Web API和EntityFramework创建N层的单页面Web应用

本片文章翻译自ABP在CodeProject上的一个简单示例程序,网站上的程序是用ABP之前的版本创建的,模板创建界面及工程文档有所改变,本文基于最新的模板创建.通过这个简单的示例可以对ABP有个更深入的了解,每个工程里应该写什么样的代码,代码如何组织以及ABP是如何在工程中发挥作用的. 源文档地址:https://www.codeproject.com/Articles/791740/Using-AngularJs-ASP-NET-MVC-Web-API-and-EntityFram 源码可以

HTTP Modules versus ASP.NET MVC Action Filters

from:http://odetocode.com/blogs/scott/archive/2011/01/17/http-modules-versus-asp-net-mvc-action-filters.aspx Monday, January 17, 2011 ASP.NET MVC has action filters, while ASP.NET has HTTP modules. Inside their respective processing pipelines, these

Demystifying ASP.NET MVC 5 Error Pages and Error Logging

出处:http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging Error pages and error logging, both so elementary and yet so complex in ASP.NET MVC. Perhaps complex is not entirely true, but it is certainly not very straight forward fo