0

ベースコントローラーのコンストラクターで、クライアント上の特定のCookieをチェックする拡張メソッドを呼び出しています。

現在、System.Web.HttpContext.Currentを使用して現在のコンテキストを取得しています。

ただし、Controller.HttpContextの方がテスト可能であり、リクエストに関する追加情報が含まれているため、Controller.HttpContextを使用する必要があると思われます。

ただし、Controller.HttpContextは、作成時にnullを返します(これは仕様によるものと考えられます)が、InitializeメソッドとExecuteメソッドでもnullを返します(Routing.RequestContext.HttpContext?を使用しない場合)。

したがって、HttpContext.Currentの代わりにController.HttpContextを使用する必要がある場合、リクエストでどの時点で使用できますか?

ありがとうベン

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);
  }
}

カスタム属性をよく読んでおくことをお勧めします。しかし、よりテスト可能なとはどういう意味ですか?rhinomocksやgooglemoqなどのモックフレームワークを使用して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 に答える