HttpContext

    //
// 摘要:
// 封装有关个别 HTTP 请求的所有 HTTP 特定的信息。
public sealed class HttpContext : IServiceProvider, IPrincipalContainer

HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试。HttpContext没有base class,并且不是virtual,所以不能用单元测试,因为没有办法mock.

HttpContextBase

    //
// 摘要:
// 用作包含有关某个 HTTP 请求的 HTTP 特定信息的类的基类。
[TypeForwardedFrom("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
public abstract class HttpContextBase : IServiceProvider

HttpContextBase, 是用来在MVC中替代HttpContext.但是这是一个abstract类,是mockable的。

HttpContextWrapper

    //
// 摘要:
// 封装包含有关单个 HTTP 请求的 HTTP 特定信息的 HTTP 内部对象。
[TypeForwardedFrom("System.Web.Abstractions, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
public class HttpContextWrapper : HttpContextBase

HttpContextWrapper是HttpContextBase的实现类,用来真正的替换HttpContext,

可以用new HttpContextWrapper(HttpContext.Current)的方式来创建一个HttpContextWrapper.

  HttpContextWrapper wrap = new HttpContextWrapper(HttpContext.Current);

观察代码可以发现,HttpContext与HttpContextWrapper在属性方法设置上基本上是一样的,只是HttpContextWrapper不是virtual,有base class,因此可以进行单元测试。

现在,关于使用到HttpContext的方法,可以通过HttpContextWrapper来进行单元测试。观察ASP.NET MVC的源码可以发现,在最终MVCHandler(ASP.NET MVC的HttpHandler)中,调用ProcessRequest(HttpContext context)方法的时候,其内部把HttpContext转为HttpContextWrapper,然后调用了ProcessRequest(HttpContext context)来进行后续的处理。

public ProcessRequest(HttpContext context)
{
HttpContextWrapper _context = new HttpContextWrapper(context);
ProcessRequest(_context);
} public ProcessRequest(HttpContextBase context)
{
//进行相应的Controller,Action的调用
}

MVC中HttpContext, HttpContextBase, HttpContextWrapper联系的更多相关文章

  1. ASP.NET MVC中HttpContext, HttpContextBase, HttpContextWrapper联系

    ttpContext HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试.HttpContext没有base class,并且不是virtual,所以不能 ...

  2. HttpContext, HttpContextBase, HttpContextWrapper之间关系

    HttpContext是最原始的ASP.NET Context. MVC的目的之一是能够单元测试. HttpContextBase, 是用来在MVC中替代HttpContext.但是这是一个abstr ...

  3. 深入分析MVC中通过IOC实现Controller依赖注入的原理

    这几天利用空闲时间,我将ASP.NET反编译后的源代码并结合园子里几位大侠的写的文章认真的看了一遍,收获颇丰,同时也摘要了一些学习内容,存入了该篇文章:<ASP.NET运行机制图解>,在对 ...

  4. ASP.NET MVC中的控制器激活与反射之间的联系(帮助理解)

    ASP.NET Mvc是ASP.NET的一个框架,同样也是基于管道的设计结构.HttpModule和HttpHandler是ASP.NET的两个重要组件,同样的在Mvc中也是非常重要的组件.在应用程序 ...

  5. Asp.Net MVC中Controller、Action、View是如何激活调用的

    上篇我们介绍了MVC的路由,知道在注册路由的时候会创建一个MvcHandler将其和Url规则一起放入到了RouteCollection中,之后请求通过UrlRoutingModule,根据当前的UR ...

  6. ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  7. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  8. 浅谈MVC中路由

    引言 学习ASP.NET MVC 路由这一关是肯定必不可少的.这一节,我们就来简单介绍下MVC中的路由机制.简单的路由机制相信大家都已了解,这一节主要介绍路由中很少使用的部分. 使用静态URL片段 在 ...

  9. YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

    上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引 ...

随机推荐

  1. bzoj3238

    都LCP了很显然是要用到后缀数组的 显然前面的那个东西是可以直接算出来的 关键在于LCP的和怎么快速的计算 不难想到穷举height[i],然后判断这个height[i]可能成为多少对后缀的LCP 考 ...

  2. (转载)C++创建对象的两种方法

    (转载)http://blog.sina.com.cn/s/blog_586b6c050100dhjg.html 在C++里,有两种方法创建对象: 方法一: ClassName object(para ...

  3. HDU 5949 Relative atomic mass 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Relative atomic mass Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  4. Selenium终极自动化测试环境搭建(二):Selenium+Eclipse+Python

    前面举例了Selenium+Eclipse+Junit+TestNG自动化测试环境的搭建,在前一篇的基础上,下面再举例Selenium+Eclipse+Python测试环境搭建. 第一步:安装Pyth ...

  5. pdb文件部分解释

    pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...

  6. 项目杂记(MONTHS_BETWEEN,Having ,Spool)

    1,oracle中计算年龄: select FLOOR(MONTHS_BETWEEN(SYSDATE, to_date('20130728', 'yyyymmdd')) / 12), trunc(mo ...

  7. vijosP1629 八

    vijosP1629 八 链接:https://vijos.org/p/1629 [思路] 暴力容斥(看他们都这么叫=_=)+精度选择. 总体思路是先统计LR区间内满足是8倍数的数目ans,再从ans ...

  8. 三大跨平台网盘--dropbox

    背景介绍 Dropbox是一个提供同步本地文件的网络存储在线应用.支持在多台电脑多种操作中自动同步.并可当作大容量的网络硬盘使用. 准备工作 帐号--dropbox官网 软件--windows/ubu ...

  9. dell vfoglight

    vFoglight针对RH/Vmware/Hyper-v/Vsphere环境的相关软件包下载链接 https://software.dell.com/register/getfile/?param=2 ...

  10. Web开发,如何从小工到专家

    最近在研读关于“整体性学习”的一些东西,收获颇丰. 整体性学习强调的东西有三样:结构.模型.与高速通道.特别是关于结构的篇章: 理解是什么?理解就是结构高度发达完善的结果. 是不是有些学科你可以轻松“ ...