0

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

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

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

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

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

谢谢本

4

2 回答 2

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

于 2010-03-23T19:48:12.120 回答
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 } }

于 2010-03-23T19:51:47.887 回答