asp.net与MVC4的路由原理和过程【学习笔记】

当IIS收到一个http请求,把请求信息发给对应的HttpModel(实际是实现类UrlRoutingModule),在HttpModel中会注册HttpApplication 类中的PostResolveRequestCache事件,通过此事件来动态选择映射HttpHandler处理程序。通过匹配到的RouteData类的RouteHandler属性得到IRouteHandler对象(MVC4是MvcRouteHandler、asp.net原生的是PageRouteHandler),通过这个对象的GetHttpHandler方法就可以得到HttpHandler处理程序。具体代码如下:

public virtual void PostResolveRequestCache(object sender, EventArgs e) {

   HttpApplication app = (HttpApplication)sender;

       HttpContextBase context = new HttpContextWrapper(app.Context);
       //详细见附1
       RouteData routeData = RouteCollection.GetRouteData(context);
       if (routeData == null) {
            return;
       }
       //详细见附1
       IRouteHandler routeHandler = routeData.RouteHandler;
       if (routeHandler is StopRoutingHandler) {
           return;
       }
       RequestContext requestContext = new RequestContext(context, routeData);
       context.Request.RequestContext = requestContext;
       IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext);
       if (httpHandler is UrlAuthFailureHandler) {
           if (FormsAuthenticationModule.FormsAuthRequired) {
                 UrlAuthorizationModule.ReportUrlAuthorizationFailure(HttpContext.Current, this);
            return;
          }
          else {
           throw new HttpException(401, SR.GetString(SR.Assess_Denied_Description3));
          }
      }
      context.RemapHandler(httpHandler);//动态指定HttpHandler
 }

附1:

RouteCollection.GetHttpHandler方法获取匹配当前路由信息的RouteData,此方法是循环遍历RouteCollection集合并调用集合中RouteBase(实现类为Route)的GetRouteData方法,并返回第一个不为Null的Roudata。Roudata实在RoudataBase的GetRouteData方法中被创建的,详见如下代码:

 public override RouteData GetRouteData(HttpContextBase httpContext) {
     string requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
     RouteValueDictionary values = _parsedRoute.Match(requestPath, Defaults);
     if (values == null) {
          return null;
     }
    //为Roudata指定IRouteHandler对象
    RouteData routeData = new RouteData(this, RouteHandler);
if (!ProcessConstraints(httpContext, values, RouteDirection.IncomingRequest)) {
          return null;
     }
     foreach (var value in values) {
          routeData.Values.Add(value.Key, value.Value);
     }
     if (DataTokens != null) {
          foreach (var prop in DataTokens) {
             routeData.DataTokens[prop.Key] = prop.Value;
          }
     }
    return routeData;
 }

public class RouteData {
        private IRouteHandler _routeHandler;
        public RouteData() {
        }
        public RouteData(RouteBase route, IRouteHandler routeHandler) {
            Route = route;
            RouteHandler = routeHandler;
        }
//更多代码
}

MVC4:动态指定到HttpHandler后,就是处理Controller的创建和Action的执行了

HttpHandler根据Routedata获取到Controller的名称,然后通过ControllerBuilder的静态方法GetControllerFactory获取IControllerFactory的实现类(默认是DefaultControllerFactory )来创建请求的IController的实现类的实例。最后执行IController的Execute方法并传入请求上下文,方法Execute实现在System.Web.Mvc.ControllerBase这个抽象类中,Execute最终调用的是System.Web.Mvc.Controller中的ExecuteCore方法,ExecuteCore方法主要是保存TempData然后根据路由数据调用执行Action。代码如下:

protected override void ExecuteCore()
{
   PossiblyLoadTempData();
   try
   {
      string actionName = GetActionName(RouteData);
      if (!ActionInvoker.InvokeAction(ControllerContext, actionName))
      {
           HandleUnknownAction(actionName);
      }
   }
    finally
    {
        PossiblySaveTempData();
    }
}
时间: 2024-11-03 21:17:16

asp.net与MVC4的路由原理和过程【学习笔记】的相关文章

Asp.net core 2.0.1 Razor 的使用学习笔记(六)

Asp.net core 2.0.1 Razor 的使用学习笔记——基本页面的建立 VS这版(vs版本:15.5.6  .net版本:4.7.02558)的Razor页面自动生成就是坑爹货,它自动生成的页面真是能坑死你不带商量的.到处错误,到处bug.不过相信微软最终是会修复的. 以下是Bug的具体情况,不关心的朋友可以直接跳过. 正常来说,创建的快捷方式是: 1.Pages右键>添加>新建文件夹>xxxx 2.xxxx右键>添加>Razor页面>使用实体框架生成Raz

ASP.NET5 Web默认的项目结构浅析(学习笔记)

1.说明 通常一些错误的知识见解发表出来,有可能误导部分读者, 势必造成一定程度伤害. 说实话,试问那个人没有被别人坑过?理解万岁吧!所以本人的博文,如有误人子弟的地方,还望大侠们扶正! 如题,本章的知识点介绍只能算浅析了.理解得对不对?不好说.同样算是我的学习笔记就够了. ASP.NET5 beta7已经发布一个多月了,预计近几天内该发布beta8了. 按照官方产品路线图公布来说,beta8该是所有功能开发大体上盖棺定论(不会大变动了)了. 然后再到RC版,就可用于生产环境中了,这是正式版前,

Linux下ASP.NET5开发工具与部署环境搭建 (学习笔记)

1.说明 由于在“古董机”上进行实践,只能安装系统是ubuntu-15.04-desktop-i386 (x86 32位桌面系统,建议你装64位的) 本想在此介绍时进行一些截图或录制视频,但对Linux系统操作不是很熟,再加上系统特别“卡”, 连汉字输入都不方便(比如这篇文章敲得费劲呀),实在是杯具,只好放弃! 以下内容,有些啰嗦,抱歉!(其实也是我学习笔记,记详细点,时间长了,不怕忘.) 以下资料来源主要参考:https://docs.asp.net和https://github.com/as

黑马公开课——运行原理与GC学习笔记

.NET Framework 程序的运行原理 .NET Framework的组成:(1)基础类库(BCL):使用线程的类来完成编程,对于不存在的类,就自己编写:(2)编译工具:将源文件,编译成"程序集"(exe或dll等)[.NET环境中,MSIL=CIL=IL](3)公共语言运行时(CLR):执行前检测.编译:执行到了某个方法时才编译这个方法的代码[即时编译器(JIT)]编译过程:.NET源代码(C#)-->通过C#编译器编译成程序集[程序集中包括:元数据(一个表,显示了程序中

Asp.net core 2.0.1 Razor 的使用学习笔记(一)

环境:vs2017 版本:15.5.6 这里说明下, Razor页面模式跟mvc出现了严重的不同.正如微软官方说的一样“Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效.” 但就代码说没有什么不同几乎完全一样,但是存放的位置却有了根本的区别.个人研究分析的结果是:Razor页面模式其实是把mvc中的控制器化整为零了,即原来控制器中的操作代码被分布放到了各个页面的.cshtml.cs文件中了.这样一来由原来mvc中文件按类型分类变成了按功能分

数据库原理与技术学习笔记

数据库经历的三个阶段: 1.人工管理阶段: 数据的管理者:人 数据面向的对象:某一应用程序 数据的共享程度:无共享,冗余度极大 数据的独立性:不独立,完全依赖于程序 数据的结构化:无结构 数据控制能力:应用程序自己控制 2.文件系统阶段:特点 数据的管理者:文件系统 数据面向的对象:某一应用程序 数据的共享程度:共享性差,冗余度大 数据的独立性:独立性差 数据的结构化:记录内有结构,整体无结构 数据控制能力:应用程序自己控制 3.数据库系统阶段:特点 数据的管理者:数据库管理系统 数据面向的对象

Web常见安全漏洞原理及防范-学习笔记

公司在i春秋上面报的一个课程.http://www.ichunqiu.com/course/55885,视频学习. OWASP攻击类型排名 www.wooyun.com 中报的漏洞,大多是注入.

CCNA学习笔记七——路由概述

静态路由协议: 动态路由协议:AS(自治系统):执行统一路由策略的一组设备的集合 EGP(外部网关协议): BGP:边界网关协议 IGP(内部网关协议): 距离矢量协议: RIP:V1,V2 IGRP EIGRP 链路状态路由协议: OSPF IS-IS 静态路由: 特点: 路由表是手工设置的 除非网络管理员干预,否则静态路由不会发生变化 路由表的形成不需要占用网络资源 适合环境 一般用于网络规模很小,拓扑结构固定的网络中 默认路由: 特点: 在所有路由类型中,默认路由优先级最低 适用环境: 一

ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)

本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC框架吗? 答案是:可以. 模拟URL映射 先来看一个Demo,在传统的.NET WebForms项目中,实现URL的拦截. 打开VS2013,新建一个“ASP.NET Web窗体应用程序”项目,并取名为Demo4URLRouting. 为了方便测试,注释掉Default.aspx页面的内容和模板引用