ASP.NET MVC Module

简介:


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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  1      public  class  CustomModule:IHttpModule
  2     {
  3          public  void  Dispose()
  4         {
  5              throw  new  NotImplementedException();
  6         }
 
  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

1
2
3
4
5
< system.web >
     < httpModules >
       < add  name = "MyCustomModule"  type = "MvcApplication.CustomModule,MvcApplication" />
     </ httpModules >
  </ system.web >

这里要说的是Name属***&ldquo;MyCustomModule&rdquo;值只是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
2
3
4
5
6
7
8
9
10
11
  1          void  context_PostResolveRequestCache( object  sender, EventArgs e)
  2         {
  3             HttpApplication context = sender  as  HttpApplication;
  4             HttpContextWrapper contextWrapper =  new  HttpContextWrapper(context.Context);
 
  6             RouteData routeData = RouteTable.Routes.GetRouteData(contextWrapper);
 
  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框架中请求->路由->控制器的一个过程。这部分内容会在控制器部分说明。




     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1423998,如需转载请自行联系原作者







目录
打赏
0
0
0
0
348
分享
相关文章
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
99 7
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
135 0
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
95 0
|
7月前
|
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
219 0
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
103 0
net MVC中的模型绑定、验证以及ModelState
net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
1715 0
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
269 0
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
195 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等