MVC学习笔记---各种上下文context
0 前言
AspNet MVC中比较重要的上下文,有如下:
- 核心的上下文有HttpContext(请求上下文),ControllerContext(控制器上下文)
- 过滤器有关有五个的上下文ActionExecutingContext,ActionExecutedContext,ResultExecutingContext,ResultExecutedContext,ExceptionContext
- 视图相关的上下文ViewContext
这些上下文之间的关系如下图所示
说明:
1、ControllerContext是对HttpContext的封装
2、过滤器等filterContext上下文都是继承自ControllerContext
3、ViewContext也是继承自ControllerContext,同时封装了对视图的对象
由此可以看出,最基础还是Aspnet的HttpContext上下文贯穿整个请求/应答的,而Mvc是将HttpContext进行再次封装成ControllerContext。所以先看明白HttpContext与ControllerContext的来龙去脉即可大致了解这些上下文。
1 HttpContext的由来
先看看园里大叔的一张图,如下所示。
大致的流程如下
- AppManagerAppDomainFactory类实现IAppManagerAppDomainFactory接口的Create方法,内部实现了创建AppDomain【HttpRuntime、HttpContext等都依附在AppDomain】、HostingEnvironment等一系列操作,并且得到一个ISAPIRuntime。
- 当IIS接受一个请求就可以通过上一步所得到的ISAPIRuntime的ProcessRequest进行处理请求。其间
①必须对WorkRequest针对不同的IIS版本进行包装,从而创建得到ISAPIWorkerRequest实例对象
②HttpRuntime调用ProcessRequestNoDemand处理上面所得到的WorkRequest,并且通过ProcessRequestInternal 实例化化请求的上下文,如下代码所示
1
|
HttpContext context = new HttpContext(wr/WorkRequest*/, false /* initResponseWriter */ ); |
③HttpContext的构造函数内部也初始化HttpRequest以及HttpResponse
具体的内部细节,可以猛戳这里去看大叔深入剖析
2 ControllerContext
ControllerContext在ControllerBase的Initialize方法内部被实例化,ControllerBase作为基类,被后期控制器所继承。ControllerContext也将作为其他的过滤器上下文的基类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
protected virtual void Initialize(RequestContext requestContext) { ControllerContext = new ControllerContext(requestContext, this ); } public RequestContext RequestContext { get { if (_requestContext == null ) { // still need explicit calls to constructors since the property getters are virtual and might return null HttpContextBase httpContext = HttpContext ?? new EmptyHttpContext(); RouteData routeData = RouteData ?? new RouteData(); _requestContext = new RequestContext(httpContext, routeData); } return _requestContext; } set { _requestContext = value; } } |
3 过滤器上下文
过滤器采用AOP(面向切面编程),可以通过实现IActionFilter,IResultFilter,IExceptionFilter,IAuthorizationFilter接口,进行附加的过滤效果。这些接口的内部方法的参数有相对应的上下文,如IActionFilter内部含有ActionExecutingContext,ActionExecutedContext上下文,而且将ControllerActionInvoker的InvokeActionMethodWithFilters内部被实例化
1
2
3
4
5
6
7
8
9
10
11
|
public interface IActionFilter { void OnActionExecuting(ActionExecutingContext filterContext); void OnActionExecuted(ActionExecutedContext filterContext); } protected virtual ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary< string , object > parameters) { ActionExecutingContext preContext = new ActionExecutingContext(controllerContext, actionDescriptor, parameters); //省略 } |
4 视图上下文
视图上下文被实例化三个地方:ViewResultBase,HttpHelper、TemplateHelpers,该上下文更多的为渲染视图提供数据支持。以ViewResultBase(继承ActionResult并重写ExecuteResult方法内部对ViewContext进行实例化)为例,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public override void ExecuteResult(ControllerContext context) { if (context == null ) { throw new ArgumentNullException( "context" ); } if (String.IsNullOrEmpty(ViewName)) { ViewName = context.RouteData.GetRequiredString( "action" ); } ViewEngineResult result = null ; if (View == null ) { result = FindView(context); View = result.View; } TextWriter writer = context.HttpContext.Response.Output; ViewContext viewContext = new ViewContext(context, View, ViewData, TempData, writer); View.Render(viewContext, writer); if (result != null ) { result.ViewEngine.ReleaseView(context, View); } } |
致此,基本介绍了MVC内部的上下文内容。如果觉得不错请点赞下,有误的话请指出,谢谢!
原文地址:http://www.cnblogs.com/luge/p/Mvc_Context.html
MVC学习笔记---各种上下文context的更多相关文章
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
- Spring MVC 学习笔记一 HelloWorld
Spring MVC 学习笔记一 HelloWorld Spring MVC 的使用可以按照以下步骤进行(使用Eclipse): 加入JAR包 在web.xml中配置DispatcherServlet ...
- Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建
Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...
- Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息
</pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- MVC学习笔记索引帖
[MVC学习笔记]1.项目结构搭建及单个类在各个层次中的实现 [MVC学习笔记]2.使用T4模板生成其他类的具体实现 [MVC学习笔记]3.使用Spring.Net应用IOC(依赖倒置) [MVC学习 ...
- ASP.NET MVC学习笔记-----Filter2
ASP.NET MVC学习笔记-----Filter(2) 接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用 ...
- .NET MVC 学习笔记(一)— 新建MVC工程
一..NET MVC 学习笔记(一)—— 新建MVC工程 接触MVC有段时间了,一直想找机会整理一下,可是限于文笔太差,所以一直迟迟羞于下手,想到最近做过的MVC项目也有一些了,花点时间整理一下方便以 ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
随机推荐
- iOS开发——UI进阶篇(三)自定义不等高cell,如何拿到cell的行高,自动计算cell高度,(有配图,无配图)微博案例
一.纯代码自定义不等高cell 废话不多说,直接来看下面这个例子先来看下微博的最终效果 首先创建一个继承UITableViewController的控制器@interface ViewControll ...
- unity销毁层级物体及 NGUI 深度理解总结
http://www.2cto.com/kf/201311/258811.html 1.想找到层级面板中某个物体,并销毁,利用下面的代码: GameObject obj = GameObjec ...
- 面向对象的 CSS (OOCSS)
原文链接:来自smashing magazine 译文 你是否听说过一个词语叫“内容就是王道”?作为一个 Web 开发者,我们的工作与内容创作有着频繁的联系.这是一条经常被引用,并且正确地解释了什么因 ...
- VB .NET周期实现
这里仅提供一个方案,当然会有比本方案更好的,欢迎提供. 简介 在vb.net实现周期调度的问题时(就是间隔固定的时间做什么事情),我们最先想到的一定是(反正我是)利用timer(定时器)来做这个计时的 ...
- qmake的使用
[TOC] 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso *** 还是先说 ...
- 4.6---找二叉树中序后继(CC150)
因为,没有重复值,所以只需要做一个标记就OK了. public class Successor { static boolean flag = false; static int result = 0 ...
- UINavigationItem UINavigationBar 关系分析
目录 1.关系分析 2.关系综述 3.概念点 4.疑问 1.关系分析 UIBarItem-> UIBarButtonItem -> UINavigationItem 1.1 UIBarIt ...
- 百度云+ KeePass 网络同步你的密码
百度云+ KeePass 网络同步你的密码 百度云一个目前不限流量不限格式能直链的网盘,速度在我这里很快,难得了!KeePass(小众介绍过 KeePass.) 是一个免费开源的密码管理类软件, ...
- AutoMapper Getting started
AutoMapper 是什么? 为什么要用AutoMapper? 如何使用AutoMapper? 在什么地方配置AutoMapper? 如何测试my mappings? AutoMapper 是什么? ...
- oracle异常记录
2015年9月14 1.在csdn论坛中看帖子,遇到的一个问题:ORA-01422 实际返回的行数超出请求的行数.