System.Web.HttpContext vs System.Web.MVC.HttpContext

时间:2013-11-24 20:32:01

标签: c# asp.net-mvc httpcontext

我的控制器使用了这样的声明(不确定顺序是否重要)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

我正在尝试访问HTTPContext并注意到我甚至无法获得HTTPContext.Current

似乎有两个HTTPContext变量,MVC就是先例。我必须完全限定对象的命名空间才能让应用程序编译。

  • 为什么有两个HTTPContext变量?
  • 使用顺序是否会影响我的冲突对象将使用哪个对象进行编译?

1 个答案:

答案 0 :(得分:15)

System.Web.HttpContext是一种具有静态Current属性的类型,您可以使用它来获取当前上下文。

没有System.Web.Mvc.HttpContext类型。您可能看到的是Controller类型公开的HttpContext属性。此属性为您提供控制器当前正在执行的上下文,并充当获取“当前”上下文的方法。它被认为是优越的,因为您可以为测试控制器注入假上下文,而伪造HttpContext.Current非常困难。

尽管不完全相关,但使用顺序并不重要:它们都被检查,如果找到两种可能的类型,编译器将抛出关于歧义的异常。重要的是你是否在命名空间声明的内部或外部声明你的使用。编译器首先检查“内部”上下文,这样如果在命名空间中声明类型,则首先检查命名空间内的using语句中的类型,并优先于您自己的类型。如果将using语句移到命名空间之外,则命名空间中的类型将优先。