ASP.NET MVC由以下两个核心组成部分构成:
- 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;
- 一个名为MvcHandler的自定义HttpHandler,用来实现对Controller的激活和Action的执行;
!!阅读本文前请先弄明白asp.net执行的流程及httpmodule与httphandler的作用。
下面是进行路由转换时相关类的简化结构图:
整个ASP.NET MVC系统的路由信息全部存放在RoteTable这个类的静态变量Routes(为一个RouteDictionary类型)中,网站开始运行时,在Application_Start中对路由进行注册:
RouteTable.Routes.Add("default", new Route{Url="{controller}/{action}"});
当一个URL请求到来时,被UrlRoutingModule拦截,拦截后执行流程如下:
- 封装当前http上下文,变为HttpContextWrapper对象。
- 根据当前的http上下文,从Routes中得到与当前请求URL相符合的RouteData对象。该对象存储有RouteHandler信息。
- 把RouteData与http上下文请求封装成一个RequestContext对象。
- 根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler。
- 执行IHttpHandler,进行请求的真正处理。
执行时序图如下图所示:
UrlRoutingModule的代码如下:
HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current); RouteData routeData = RouteTable.Routes.GetRouteData(httpContext); RequestContext requestContext = new RequestContext{ data = routeData, context= httpContext}; IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext); httpContext.RemapHandler(handler);
经过上面最后一步,执行HttpHandle后,程序正式进入Controller激活里面,相关类关系如下图所示:
同URL路由一样,MVC初始化时,也需要注册控制器的一些信息,这里是要让框架知道默认的控制器工厂是什么,所以在Application_Start中:
ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());
程序通过上面的URL路由转换后,进入HttpHandle中,经过以下步骤实现对Controller的激活:
- 从Requestcontext封装的RouteData中得到Controller名字。
- 通过ControllerBuilder得到当前默认的Controller工厂。
- 根据Controller的名字,创建控制器对象(在ControllerFactory初始化的时候,会扫描整个程序集中所有实现IController接口的控制器类型,所以当调用CreateController时,实际上是直接获取)。
- 最后执行控制器。执行的实质其实就是执行ActionInvoker.InvokeAction,即根据请求上下文执行相应的Action。
在自定义的MvcHandler中,代码如下:
string controllerName =this.Requestcontext.RouteData.Controller; IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory(); IController controller = controllerFactory.CreateController(this.RequestContext,controllerName); controller.Execute(this.RequestContext);
一个典型的IActionInvoker接口实现ControllerActionInvoker的InvokeAction方法如下:
public void InvokeAction(ControllerContext controllerContext, string actionName) { //找到Action方法 MethodInfo method = controllerContext.Controller.GetType().GetMethods() .First(m=>string.Compare(actionName,m.Name,true)==0); //获取Action参数,并进行Model绑定 List<object> parameters = new List<object>(); foreach(ParameterInfo parameter in method.GetParameters()) { parameters.Add(this.ModelBinder.BindModel(controllerContext, parameter.Name, parameter.ParameterType)); } //执行Action,并得到ActionResult ActionResult actionResult = method.Invoke(controllerContext.Controller, parameters.ToArray()) as ActionResult; //最终ActionResult用HttpResponse将数据传回客户进行显示 actionResult.ExecuteResult(controllerContext); }
最终形成一个Http Response传回到客户端!!
以上即为我整理的ASP.NET MVC的两个核心流程,希望新手看的明白,老手多多指点其中的问题,谢谢!!有时间会继续放出MVC其它核心技术。如Model绑定、数据验证等,同时认真向Artech学习!!!!
原文地址 :http://blog.csdn.net/lvjin110/article/details/13617159
相关推荐
《用ASP.NET实现对Image数据的存取》一文详细探讨了如何利用ASP.NET框架及ADO.NET技术对数据库中的图像数据进行高效管理和操作,这对于任何需要在网络应用中集成图像上传、下载或显示功能的开发者来说,都是极为宝贵...
《基于ASP.NET的网上书店销售系统》一文由刘海蓉撰写,发表于《长春师范学院学报(自然科学版)》2009年第6期。该文主要介绍了基于ASP.NET技术构建的一个网上书店销售系统的设计与实现过程。 #### 二、系统功能模块...
10. **ASP.NET Core**:微软的新一代跨平台框架,结合了ASP.NET MVC和Web API,支持.NET Core和.NET Framework。 11. **Blazor**:ASP.NET的最新成员,允许使用C#在浏览器端进行客户端应用开发。 12. **Web服务和...
《ASP.NET AJAX深入浅出》一文通过赵劼这位MSDN特邀讲师的视角,全面而细致地剖析了ASP.NET AJAX的技术原理与应用实践,旨在帮助读者掌握如何在Web开发中有效利用AJAX提升用户体验。 ### AJAX简述 文章首先回顾了...
在《ASP.NET Framework深度历险》一文中,作者uestc95@263.net深入探讨了ASP.NET框架的核心技术和内部机制。本文旨在解析ASP.NET框架下HTTP请求的生命周期,对比传统ASP技术,揭示ASP.NET技术革命性的变化,以及如何...
系统名称:双鱼林asp.net图书信息管理系统学习版 系统功能: (1)系统分两种身份:管理员和读者,读者可以分为不同的类型,每种类型借书天数和续借天数都不一样! (2)图书管理:添加图书类别,维护图书类别,登记图书...
综上所述,《基于ASP.NET的课堂教学平台设计与开发》一文深入探讨了如何运用UML统一建模、ASP.NET开发技术、SQL Server数据库以及XML数据共享等关键技术,设计并开发了一个功能全面、交互性强的网络教学平台。...
[Asp.net+SQL]仿阿里巴巴B2B电子商务系统_hyb2b 1.把"Web"文件夹内的文件拷贝到某个文件夹 2.在IIS中新建站点,指向该文件夹,如果新建虚拟路径,会导致一些图片的不正常显示. 3."Database"文件夹内有数据库文件hyb2...
本光盘包括 毕业论文,英文翻译,源程序及程序要用到的数据库. 系统使用说明: 1.数据库为sqlserver,将Data下的数据文件附加到...一文读懂2014年全球互联网广告新生态 http://download.csdn.net/detail/cleopard/8340303
《Asp.Net细节性问题精萃》一文深入探讨了Asp.Net开发中常见的细节问题,对于提升开发者技能、优化应用程序具有重要意义。以下是对该文关键知识点的详细解析: ### 1. `<%=%>`与`<%#%>`的区别 - **执行时机**:`...
了解Transformer的工作原理、它如何与语言建模、序列到序列建模相关,以及它如何支持Google的BERT模型。现在,我喜欢做一名数据科学家,从事自然语言处理(NaturalLanguageProcessing,NLP)方面的工作。这些突破和...
在《Asp.net Web應用程式設計-簡易聊天室》一文中,作者周季賢介紹了如何使用Asp.net 2.0來實現一個基礎的網路聊天室。在該基礎之上,《Asp.net Web應用程式設計-聊天室進階版》則進一步增強了聊天室的功能,不僅...
在本文中,将探讨Gridview控件中的一些功能特性和用法,如果各位读者对Gridview控件不大了解,可以通过《使用ASP.NET 2.0中的Gridview控件》一文,来对Gridview控件有个初步的认识。 1、使用Gridview插入新记录 在...
《Visual C#.NET与Visual Basic.NET的差异》一文深入探讨了两种编程语言在微软.NET框架下的异同,这是微软官方对于这两种语言特性的详细对比分析。以下是对该文核心知识点的总结与扩展: ### 1. **语法敏感性** ...
【描述】该压缩包是根据《ASP.NET Core 3.1中整体项目搭建(仓储+服务+抽象接口)》一文编写的实际代码示例。在ASP.NET Core 3.1中,开发者可以利用框架的强大功能来创建高效、可扩展的Web API服务。此项目旨在教授...
《.Net Web经典优化》一文探讨了针对网站性能提升和代码优化的策略,适合初学者学习。本文主要关注以下几个方面: 1. **数据库操作优化**: - 使用`Page.IsPostBack`属性来避免对往返过程执行不必要的处理。在`...
在这个系统中,互联网(Internet)扮演了关键角色,它是一种通信协议,就像人类用普通话或英语进行交流一样,让计算机间有统一的语言进行通信。 协议是网络通信中的规范,确保不同设备之间可以理解和处理彼此发送的...
《基于ASP.NET的在线考试系统的设计与实现》一文深入探讨了如何利用ASP.NET技术和SQL Server 2000数据库技术来构建一套高效、可靠的在线考试系统。 #### 关键技术介绍 **1. ASP.NET技术** - **简介**: ASP.NET是一...
此代码是拙文《.net网络编程之一:Socket编程》一文的代码,如果大家对代码有不明白的地方,可以到http://blog.csdn.net/zhoufoxcn/archive/2009/03/18/4000301.aspx查看原文。