`
wyf
  • 浏览: 436922 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

仅此一文让你明白ASP.NET MVC原理

    博客分类:
  • MVC
 
阅读更多

ASP.NET MVC由以下两个核心组成部分构成:

  1. 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;
  2. 一个名为MvcHandler的自定义HttpHandler,用来实现对Controller的激活和Action的执行;

!!阅读本文前请先弄明白asp.net执行的流程及httpmodule与httphandler的作用。

下面是进行路由转换时相关类的简化结构图:

http://www.cnblogs.com/DotCpp/

 

 整个ASP.NET MVC系统的路由信息全部存放在RoteTable这个类的静态变量Routes(为一个RouteDictionary类型)中,网站开始运行时,在Application_Start中对路由进行注册:

RouteTable.Routes.Add("default", 
      new Route{Url="{controller}/{action}"});

 

当一个URL请求到来时,被UrlRoutingModule拦截,拦截后执行流程如下:

  1. 封装当前http上下文,变为HttpContextWrapper对象。
  2. 根据当前的http上下文,从Routes中得到与当前请求URL相符合的RouteData对象。该对象存储有RouteHandler信息。
  3. 把RouteData与http上下文请求封装成一个RequestContext对象。
  4. 根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler。
  5. 执行IHttpHandler,进行请求的真正处理。

执行时序图如下图所示:

http://www.cnblogs.com/DotCpp/

 

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激活里面,相关类关系如下图所示:

http://www.cnblogs.com/DotCpp/

 

同URL路由一样,MVC初始化时,也需要注册控制器的一些信息,这里是要让框架知道默认的控制器工厂是什么,所以在Application_Start中:

ControllerBuilder.Current.SetControllerFactory(new DefaultControllerFactory());

程序通过上面的URL路由转换后,进入HttpHandle中,经过以下步骤实现对Controller的激活:

  1. 从Requestcontext封装的RouteData中得到Controller名字。
  2. 通过ControllerBuilder得到当前默认的Controller工厂。
  3. 根据Controller的名字,创建控制器对象(在ControllerFactory初始化的时候,会扫描整个程序集中所有实现IController接口的控制器类型,所以当调用CreateController时,实际上是直接获取)。
  4. 最后执行控制器。执行的实质其实就是执行ActionInvoker.InvokeAction,即根据请求上下文执行相应的Action。

http://www.cnblogs.com/DotCpp/

在自定义的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实现对Image数据的存取》一文详细探讨了如何利用ASP.NET框架及ADO.NET技术对数据库中的图像数据进行高效管理和操作,这对于任何需要在网络应用中集成图像上传、下载或显示功能的开发者来说,都是极为宝贵...

    基于ASP.NET的网上书店销售系统

    《基于ASP.NET的网上书店销售系统》一文由刘海蓉撰写,发表于《长春师范学院学报(自然科学版)》2009年第6期。该文主要介绍了基于ASP.NET技术构建的一个网上书店销售系统的设计与实现过程。 #### 二、系统功能模块...

    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深入浅出

    《ASP.NET AJAX深入浅出》一文通过赵劼这位MSDN特邀讲师的视角,全面而细致地剖析了ASP.NET AJAX的技术原理与应用实践,旨在帮助读者掌握如何在Web开发中有效利用AJAX提升用户体验。 ### AJAX简述 文章首先回顾了...

    ASP.NET Framework深度历险

    在《ASP.NET Framework深度历险》一文中,作者uestc95@263.net深入探讨了ASP.NET框架的核心技术和内部机制。本文旨在解析ASP.NET框架下HTTP请求的生命周期,对比传统ASP技术,揭示ASP.NET技术革命性的变化,以及如何...

    ASP.Net + access图书管理系统

    系统名称:双鱼林asp.net图书信息管理系统学习版 系统功能: (1)系统分两种身份:管理员和读者,读者可以分为不同的类型,每种类型借书天数和续借天数都不一样! (2)图书管理:添加图书类别,维护图书类别,登记图书...

    基于ASP.NET的课堂教学平台

    综上所述,《基于ASP.NET的课堂教学平台设计与开发》一文深入探讨了如何运用UML统一建模、ASP.NET开发技术、SQL Server数据库以及XML数据共享等关键技术,设计并开发了一个功能全面、交互性强的网络教学平台。...

    [Asp.net+SQL]仿阿里巴巴B2B电子商务系统_hyb2b

    [Asp.net+SQL]仿阿里巴巴B2B电子商务系统_hyb2b 1.把"Web"文件夹内的文件拷贝到某个文件夹 2.在IIS中新建站点,指向该文件夹,如果新建虚拟路径,会导致一些图片的不正常显示. 3."Database"文件夹内有数据库文件hyb2...

    ASP.NET车站售票系统的设计与实现[源码+毕业论文+数据库]

    本光盘包括 毕业论文,英文翻译,源程序及程序要用到的数据库. 系统使用说明: 1.数据库为sqlserver,将Data下的数据文件附加到...一文读懂2014年全球互联网广告新生态 http://download.csdn.net/detail/cleopard/8340303

    Asp.Net细节性问题精萃

    《Asp.Net细节性问题精萃》一文深入探讨了Asp.Net开发中常见的细节问题,对于提升开发者技能、优化应用程序具有重要意义。以下是对该文关键知识点的详细解析: ### 1. `&lt;%=%&gt;`与`&lt;%#%&gt;`的区别 - **执行时机**:`...

    一文理解Transformer的工作原理

    了解Transformer的工作原理、它如何与语言建模、序列到序列建模相关,以及它如何支持Google的BERT模型。现在,我喜欢做一名数据科学家,从事自然语言处理(NaturalLanguageProcessing,NLP)方面的工作。这些突破和...

    Asp.net Web應用程式設計-聊天室進階版

    在《Asp.net Web應用程式設計-簡易聊天室》一文中,作者周季賢介紹了如何使用Asp.net 2.0來實現一個基礎的網路聊天室。在該基礎之上,《Asp.net Web應用程式設計-聊天室進階版》則進一步增強了聊天室的功能,不僅...

    ASP.NET2.0中用Gridview控件操作数据的代码

    在本文中,将探讨Gridview控件中的一些功能特性和用法,如果各位读者对Gridview控件不大了解,可以通过《使用ASP.NET 2.0中的Gridview控件》一文,来对Gridview控件有个初步的认识。 1、使用Gridview插入新记录 在...

    Visual C#.NET与Visual Basic.NET的差异

    《Visual C#.NET与Visual Basic.NET的差异》一文深入探讨了两种编程语言在微软.NET框架下的异同,这是微软官方对于这两种语言特性的详细对比分析。以下是对该文核心知识点的总结与扩展: ### 1. **语法敏感性** ...

    Test_NETCoreWebAPI.zip

    【描述】该压缩包是根据《ASP.NET Core 3.1中整体项目搭建(仓储+服务+抽象接口)》一文编写的实际代码示例。在ASP.NET Core 3.1中,开发者可以利用框架的强大功能来创建高效、可扩展的Web API服务。此项目旨在教授...

    .Net Web经典优化

    《.Net Web经典优化》一文探讨了针对网站性能提升和代码优化的策略,适合初学者学习。本文主要关注以下几个方面: 1. **数据库操作优化**: - 使用`Page.IsPostBack`属性来避免对往返过程执行不必要的处理。在`...

    计算机网络重磅来袭——一文让你拨开迷雾,直击网络原理.docx

    在这个系统中,互联网(Internet)扮演了关键角色,它是一种通信协议,就像人类用普通话或英语进行交流一样,让计算机间有统一的语言进行通信。 协议是网络通信中的规范,确保不同设备之间可以理解和处理彼此发送的...

    基于ASP_NET的在线考试系统的设计与实现.pdf

    《基于ASP.NET的在线考试系统的设计与实现》一文深入探讨了如何利用ASP.NET技术和SQL Server 2000数据库技术来构建一套高效、可靠的在线考试系统。 #### 关键技术介绍 **1. ASP.NET技术** - **简介**: ASP.NET是一...

    .net网络编程之一:Socket编程一文源代码

    此代码是拙文《.net网络编程之一:Socket编程》一文的代码,如果大家对代码有不明白的地方,可以到http://blog.csdn.net/zhoufoxcn/archive/2009/03/18/4000301.aspx查看原文。

Global site tag (gtag.js) - Google Analytics