zoukankan      html  css  js  c++  java
  • ASP.NET MVC生命周期与管道模型

     
    先来熟悉下asp.net请求管道
    1.当客户端发送http://localhost:80/home/index请求时
    2.首先到达服务端的内核模块HTTP.SYS(它监听80端口),通过访问注册表,将请求转交给IIS处理
    3.IIS中w3svc服务访问IIS核心进程InetInfo.exe中元数据信息,获取请求交给哪个具体的WorkProcess进行处理 (IIS6中有多个WorkProcess工作进程 它是.Net代码执行所在的宿主)
    5.具体的WorkProcess将请求交给aspnet_isapi.dll(非托管的Com组件 它负责启动.net运行时 将请求信息交给运行时ISAPIRuntime)
    6.ISAPIRuntime的PR方法通过ECB指针创建HttpWorkProcess对象 传入HttpRuntime中
    7.HttpRuntime的PR方法通过HttpWorkProcess对象 封装出HttpContext对象(包含HttpRequest HttpResponse Session...)
    8.再通过HttpApplicationFactory获取HttpApplication实例
        如果是第一次请求,做两件事
          1.会编译Global.asax成HttpApplication类型  创建特殊应用程序池 调用池中特殊Application对象的Application_Start方法
        2.从池子中获取一个普通的HttpApplication实例 如果池子是空的 则通过Global.asax反射得到(MVC中得到的就是MVCApplication),同时调用HttpApplication实例的Init()方法,方法内部初始化所有的HttpMoudle(配置文件中所有HttpMoudle)UrlRouteMoudlue在此时初始化
    说这么多您可能不理解 我们通过Reflect反编译看下源码的执行过程 如下图:
     
    • 路由模块对象以及路由注册、路由数据获取

    上述有个要点需要重复下,就是Application_Start方法中路由的注册
    这里就扯到MVC的路由了,下图阐述路由模块锁涉及的几大对象以及Application_Start方法中进行的路由注册,同时简要说明RouteTable是如何通过请求地址获得最终的RouteData路由数据的
     
    • UrlRouteMoudle内部

    在接下来看看UrlRouteMoudle的Init方法中究竟做了些什么?它是如何将原本的请求处理Handler"转交"给MvcHandler的
    源码如下:
    public class UrlRoutingModule : IHttpModule {
        public void Dispose() {
        }
        public void Init(HttpApplication context) {
            context.PostResolveRequestCache += OnPostResolveRequestCache;
        }
        protected virtual void OnPostResolveRequestCache(object sender, EventArgs e) {
            //封装当前上下文至HttpContextWrapper中
            HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current);
            //根据上下文信息 从路由表RouteTable 中的路由集合RouteCollection  获取路由数据RouteData
            //RouteTable数据在Application_Start中填充
            RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);
            if(null == routeData) {//如果路由数据不存在
                return;
            }
            //将传入的HttpContextWrapper上下文信息与路由数据封装至新的RequestContext上下文 供后续RouteHandler使用
            RequestContext requestContext = new RequestContext {
                RouteData = routeData,
                HttpContext = httpContext
            };
            //路由数据 通过 RouteHandler 获取真正处理请求的IHttpHandler对象 ->实质就是MvcHandler对象
            IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
            //将原始请求 重定向到当前的IHttpHandler上  (从原有WebForm中的IHttpHandler切至MvcHandler)
            httpContext.RemapHandler(handler);
        }
    }
    图析如下:

    • MVCHandler

    接下来无疑是进入MVCHandler的具体处理了,如何创建控制器,控制器如何执行方法... 这方面没有深入的了解,只知道个大概,
    通过ControllerFactory创建Controller,
    通过ExecuteResult获取执行结果
    通过Render渲染视图
    完整流程图如下:
     
     
     

     原文来自 痞子一毛  Asp.Net MVC请求处理图解一文

  • 相关阅读:
    [LeetCode]Binary Tree Level Order Traversal
    [LeetCode]Binary Tree Postorder Traversal
    Netty(六):NioServerSocketChannel源码解析
    Netty(五):ServerBootstrap启动流程
    Netty(四):AbstractChannel源码解析
    Netty(三):IdleStateHandler源码解析
    自定义fastjson对枚举类型的序列化及反序列化过程
    TCP连接过程及报文解析
    Netty(二):数据在ChannelPipeline中的流经
    Netty(一):ByteBuf读写过程图解
  • 原文地址:https://www.cnblogs.com/johnx/p/9772750.html
Copyright © 2011-2022 走看看