在哪里使用Controller.HttpContext

时间:2010-03-23 19:38:33

标签: asp.net-mvc httpcontext

在我的基本控制器的构造函数中,我调用的是一种扩展方法,用于检查客户端上的特定cookie。

目前我正在使用System.Web.HttpContext.Current来获取当前上下文。

但是,我认为我应该使用Controller.HttpContext,因为它更易于测试并包含有关请求的其他信息。

但是,Controller.HttpContext在创建时返回null(相信这是设计),还在Initialize和Execute方法上返回null(除非我使用Routing.RequestContext.HttpContext?)。

所以,如果我应该使用Controller.HttpContext而不是HttpContext.Current,请求在什么时候可以使用?

由于 本

2 个答案:

答案 0 :(得分:5)

当您在控制器中调用操作方法时,可以获取Controller.HttpContext。这意味着您可以在操作方法

中访问它

如果你想在每个请求上检查一下你可以使用自定义属性,请看这个例子:

public class LoggingFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +
        filterContext.ActionDescriptor.ActionName);

    base.OnActionExecuting(filterContext);
  }

  public override void OnActionExecuted(ActionExecutedContext filterContext)
  {
    if (filterContext.Exception != null)
        filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");

    base.OnActionExecuted(filterContext);
  }
}

我建议您阅读自定义属性。但是你说更可测试的是什么意思?您可以使用像rhino mocks或google moq

这样的模拟框架轻松模拟您的httpcontext

答案 1 :(得分:1)

如果您关心可测试性,我会用接口结束对HttpContext的访问并解析它/将其注入您的控制器。

public class CookieValidator : ICookieValidator
{
   private HttpContext _Context;
   public HttpContext Context
   {
      get
      {
         if(_Context == null)
         {
             _Context = HttpContext.Current;
         }
         return _Context;
      }
      set  // set a mock here when unit testing
      {
         _Context = value;
      }
   }

public bool HasValidCookies() { _Context... // do your logic here } }