*过程描述

当浏览器发出一个http请求后,该请求被UrlRoutingModule截获,UrlRoutingModule根据请求上下文去系统路由表(RouteTable)中匹配,从中获取一个RouteData,包含了请求的路由信息,特别是包含一个RouteHandler属性,因为在global的Application_Start方法中我们注册了mvc的路由规则,所以该RouteHandler属性的类型是MvcRouteHandler(实现了IRouteHandler)。UrlRoutingModule根据RouteData的RouteHandler属性又可以得到一个HttpHandler,该HttpHandler的类型是MvcHttpHandler(因为RouteHandler的类型是MvcRouteHandler),并由MvcHttpHandler来具体处理请求的一些逻辑。

MvcHttpHandler类实现了IHttpHandler,其核心方法是ProcessRequest,它也是IHttpHandler接口中唯一要实现的方法,该方法被用来处理请求。

在处理请求时,MvcHttpHandler会根据请求信息生成相应Controller的实例(所有Controller类最终会继承一个IController接口,该接口中包含一个Execute方法,用来执行指定的请求上下文),该Controller的实例会根据请求信息调用指定的acton。在执行action的过程中又经历了请求参数的模型绑定,操作过滤器的请求拦截处理和操作逻辑的执行。

Controller中Action返回给客户端的都是ActionResult类型,ActionResult是一个抽象类,其实现主要包含两类:ViewResult类和非ViewResult类(如JsonResult、ContentResult、FileResult等)。如果Action返回的是非ViewResult,则内容将直接被输送到Response响应流中,显示给客户端,而如果返回的是ViewResult,则视图引擎会找到需要被渲染的视图,视图被加载成WebViewPage<TModel>类型,并渲染生成Html,最终返回Html。

*细节补充

1.UrlRoutingModule中的方法为什么会在请求中被调用

一个请求进入ASP.NET请求处理管道时,会经历19个阶段,即19个事件,其中的PostResolveRequestCache事件被UrlRoutingModule中的方法注册,这样自然在经历PostResolveRequestCache事件时,会去调用UrlRoutingModule中的方法。其中UrlRoutingModule对象是ASP.NET根据在全局webconfig(C\Windows\Microsoft.NET\Framework\版本号\Config\Web.config)中的配置预先加载的。

UrlRoutingModule继承了IHttpModule接口,该接口中的init方法被用来向上述19个事件中注册事件处理程序。ASP.NET也是因为IHttpModule,可以实现拓展。

2.路由表中的路由规则是何时被注册的,RouteData中RouteHandler属性的类型为什么是MvcRouteHandler?

路由表中的路由规则是在global中的Application_Start方法中被注册的,此处注册的方法是RouteConfig.RegisterRoutes(RouteTable.Routes),该方法内部调用了RouteCollection对象的MapRoute方法,而该方法内部其实已经定义了当前路由的RouteHandler为MvcRouteHandler。

*完整的请求处理图

*参考文章

1.http://www.cnblogs.com/canfengfeixue/p/8035311.html

2.https://www.cnblogs.com/ensleep/p/5458270.html

ASP.NET MVC从请求到响应发生了什么的更多相关文章

  1. 详解ASP.NET MVC的请求生命周期

    本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...

  2. ASP.NET MVC的请求生命周期

    我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...

  3. ASP.NET MVC通用权限管理系统(响应布局)源码更新介绍

    一.asp.net mvc 通用权限管理系统(响应布局)源码主要以下特点: AngelRM(Asp.net MVC)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash ...

  4. Asp.net MVC进入请求管道的过程

    Asp.net MVC进入请求管道的过程 Asp.Net MVC 跟AspNet 入口解释 Asp.Net MVC请求处理过程 mvc 请求模型 mvc的原理 mvc模型 NewMVCPipleLin ...

  5. Asp.net MVC 之请求生命周期

    今天主要试着描述一下ASP.NET MVC 请求从开始到结束的整个生命周期,了解这些后,对MVC会有一个整体的认识. 这里主要研究了MVC请求的五个过程. 1.创建RouteTable 当ASP.NE ...

  6. Asp.Net MVC如何返回401响应码

    需求:     在默认创建的Asp.Net MVC项目中(这里使用VS2013),需要手动返回一个401响应码给浏览器.我们的代码可能是下面这样子的.   public ActionResult Un ...

  7. asp.net MVC通用权限管理系统-响应式布局-源码

    一.Angel工作室简单通用权限系统简介 AngelRM(Asp.net MVC Web api)是基于asp.net(C#)MVC+前端bootstrap+ztree+lodash+jquery技术 ...

  8. 基于ASP.NET MVC和Bootstrap搭建响应式个人博客站(一)

    1.0 为什么要做这个博客站? www.zynblog.com   在工作学习中,经常要搜索查找各种各样的资料,每次找到相关资料后都会顺手添加到浏览器书签中,时间一长,书签也就满了.而且下次再点击这个 ...

  9. ASP.NET MVC AJAX 请求中加入 antiforgerytoken 解决“所需的防伪表单字段“__RequestVerificationToken”不存在”问题

    在ASP.NET mvc中如果在表中使用了@Html.AntiForgeryToken(),ajax post不会请求成功 解决方法是在ajax中加入__RequestVerificationToke ...

随机推荐

  1. [HAOI2017] 新型城市化

    给出的图中恰包含2个团,则图的补图为一个二分图,其最大独立集为原图的最大团. 我们知道,二分图的最大独立集=V-最小顶点覆盖,最小顶点覆盖=最大匹配. 问题转化为:计算删去后最大匹配减小的边集. 所以 ...

  2. struts2 拦截器弊端

    struts2 怎样在action内获得fielderror

  3. java-Timer类使用方法

    Timer: public Timer()创建一个新计时器.相关的线程不 作为守护程序运行. 方法摘要: void schedule(TimerTask task, Date time)        ...

  4. Storm 入门教程

    在这个教程中,你将学会如何创建 Storm 的topology并将他们部署到 Storm 集群上, 主要的语言是 Java,但是少数几个例子用 Python 编写来说明 Storm 的多语言支持能力. ...

  5. 关于wepack的使用总结以及优化探讨

    一.前言 不知不觉,webpack版本已经到4.0了.使用它也有很长一段时间了,回头看看,自己木有总结webpack方面的知识,现在有空起个头,主要是总结自己常用的配置和一下优化的探讨,以后有啥想法也 ...

  6. #18 turtle模块

    前言 这一节继续记录模块,本节将记录Python中一个非常重要的画图模块——turtle,Here we go! 一.turtle模块 turtle(海龟)模块是Python中强大的内置画图模块,可以 ...

  7. windows7安装flask-mysqldb遇到的坑

    最近在windows环境上搭建flask使用环境,遇到过很多坑,这次就记录下安装flask-mysqldb所遇到的坑. 正常逻辑是使用pip install flask-mysqldb进行安装.但是会 ...

  8. S3C2440的中断体系结构

    概述 S3C2440A中的中断控制器接受来自60个中断源的请求.提供这些中断源的可以是内部外设,如DMA控制器.UART.IIC等等.在这些中断源中,UARTn.AC97和EINTn中断对于中断控制器 ...

  9. Java并发编程:ThreadLocal的使用以及实现原理解析

    前言 前面的文章里,我们学习了有关锁的使用,锁的机制是保证同一时刻只能有一个线程访问临界区的资源,也就是通过控制资源的手段来保证线程安全,这固然是一种有效的手段,但程序的运行效率也因此大大降低.那么, ...

  10. ELK日志分析平台系统CentOS7环境搭建和基本使用

    一.搭建环境 系统环境:CentOS7 安装iptables:https://blog.csdn.net/momo_mutou/article/details/81739155 jdk1.8:  ht ...