Где использовать Controller.HttpContext - PullRequest
0 голосов
/ 23 марта 2010

В конструкторе моего базового контроллера я вызываю метод расширения, который проверяет наличие определенных файлов cookie на клиенте.

В настоящее время я использую System.Web.HttpContext.Current для получения текущего контекста.

Однако я считаю, что мне следует использовать Controller.HttpContext, поскольку он более тестируем и содержит дополнительную информацию о запросе.

Однако Controller.HttpContext возвращает ноль при создании (полагаю, что это сделано по замыслу), а также при методах Initialize и Execute (если я не использую Routing.RequestContext.HttpContext?).

Так что, если я должен использовать Controller.HttpContext вместо HttpContext.Current, в какой момент он доступен мне в запросе?

Спасибо Бен

Ответы [ 2 ]

5 голосов
/ 23 марта 2010

Вы можете получить свой 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);
  }
}

Я предлагаю вам прочитать о пользовательских атрибутах. Но что вы имеете в виду под более тестируемым? Вы можете легко смоделировать ваш httpcontext с помощью насмешливого фреймворка, такого как rhino mocks или Google Moq

1 голос
/ 23 марта 2010

Если вас интересует тестируемость, я бы обернул доступ к HttpContext интерфейсом и разрешил / внедрил его в ваш контроллер.

<code>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;
      }
   }</p>

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