zoukankan      html  css  js  c++  java
  • 转载(ASP.NET原理)

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

    1. 一个名为UrlRoutingModule的自定义HttpModule,用来解析Controller与Action名称;
    2. 一个名为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拦截,拦截后执行流程如下:

    1. 封装当前http上下文,变为HttpContextWrapper对象。
    2. 根据当前的http上下文,从Routes中得到与当前请求URL相符合的RouteData对象。该对象存储有RouteHandler信息。
    3. 把RouteData与http上下文请求封装成一个RequestContext对象。
    4. 根据RequestContext对象,从RouteData的RouteHandler中获取IHttpHandler。
    5. 执行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的激活:

    1. 从Requestcontext封装的RouteData中得到Controller名字。
    2. 通过ControllerBuilder得到当前默认的Controller工厂。
    3. 根据Controller的名字,通过反射创建控制器对象。
    4. 最后执行控制器。执行的实质其实就是执行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);
    复制代码

    以上即为我整理的ASP.NET MVC的两个核心流程,希望新手看的明白,老手多多指点其中的问题,谢谢!!有时间会继续放出MVC其它核心技术。如Model绑定、数据验证等,同时认真向Artech学习!!!!

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    mac flutter 创建过程及遇到的问题
    MAC 终端编辑完成后如何保存:
    mac下添加环境变量
    beanstalkd队列
    小程序真机上报错 for developer: some selectors are not allowed in component wxss , including tag name selectors, id selectors, and attribute selectors
    小程序通过web-view实现与h5页面之间的交互
    小程序中的web-view与h5网页之间的交互
  • 原文地址:https://www.cnblogs.com/gaojian0927/p/3978773.html
Copyright © 2011-2022 走看看