*过程描述

当浏览器发出一个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. Python内置类型(4)--数值

    Python有以下三种的数值类型: 整型(integers), 浮点型(floating point numbers), 以及 复数(complex numbers).此外,布尔是整数的子类型. 数值 ...

  2. zabbix报错cannot set resource limit: [13] Permission denied解决方法

    zabbix-server启动时出现以下错误: 2912:20180326:050930.023 using configuration file: /etc/zabbix/zabbix_server ...

  3. mysql 开发进阶篇系列 36 工具篇mysqlshow(数据库对象查看工具)

    一.概述 mysqlshow客户端查找工具,能很快地查找存在哪些数据库,数据库中的表,表中的列或索引,和mysql客户端工具很类似,不过有些特性是mysql客户端工具所不具备的. mysqlshow的 ...

  4. IDA远程调试 在内存中dump Dex文件

    1. 首先使用调试JNI_OnLoad函数的方法,先将apk以调试状态挂起,使用IDA附加上去. 2. 然后在libdvm.so中的dvmDexFileOpenPartial函数上下一个断点 3. 然 ...

  5. kafka集群管理

    1.启动kafka集群 kafka 没有提供同时启动集群中所有节点的执行脚本,这里自定义一个脚本 名称为 kafka-cluster-start.sh 2.关闭节点 kafka自带关闭脚本 kafka ...

  6. 协程及Python中的协程

    1 协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解 ...

  7. python集合操作和内置方法

    一 集合基本介绍 集合:在{}内用逗号隔开每个值,集合的特点: 每个值必须是不可变类型 集合是无序的 集合的值不能重复 集合的应用场景较少,最重要的应用场景为进行关系运算以及去重. 二 集合的操作 1 ...

  8. asp.net mvc 模型验证组件——FluentValidation

    asp.net mvc 模型验证组件——FluentValidation 示例 using FluentValidation; public class CustomerValidator: Abst ...

  9. MVC EF 执行SQL语句(转载)

    MVC EF 执行SQL语句 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LI ...

  10. C#基础知识回顾-- 反射(2)

    使用反射调用方法: 一旦知道一个类型所支持的方法,就可以对方法进行调用.调用时,需使用包含在   MethodInfo中的Invoke()方法.调用形式:   object Invoke(object ...