【问题标题】:Where to use Controller.HttpContext在哪里使用 Controller.HttpContext
【发布时间】:2010-03-23 19:38:32
【问题描述】:

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

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

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

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

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

谢谢 本

【问题讨论】:

    标签: asp.net-mvc httpcontext


    【解决方案1】:

    当您在控制器中调用操作方法时,您可以获得 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

    【讨论】:

    • @Chino - 在您更新之后,我可以看到 ActionFilter 可以很好地工作。感谢您的帮助。
    【解决方案2】:

    如果您关心可测试性,我会用一个接口来结束对 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 } }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2012-10-07
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多