asp.net ActionFilter フィルター

巴扎黑
巴扎黑オリジナル
2017-09-01 14:41:371763ブラウズ

この記事では、主に asp.net core MVC フィルターの ActionFilter フィルターについて詳しく紹介します。興味のある方は参考にしてください。

このシリーズでは、asp.net core MVC の組み込みフィルターの使用について説明します。以下の章に分かれます

asp.net core MVCフィルター - ExceptionFilterフィルター(1)

asp.net core MVCフィルター - ActionFilterフィルター(2)

asp.net core MVCフィルターResultFilterフィルター(3)

asp.net core MVC フィルター ResourceFilter フィルター (4)

asp.net core MVC フィルター AuthorizationFilter フィルター (5)

はじめに

Action フィルターは、コントローラーの Action が実行される前後に、対応するメソッドを実行します。

カスタムアクションフィルターの実装

グローバル例外フィルターをカスタマイズするには、IActionFilterインターフェースを実装する必要があります


public class ActionFilter : IActionFilter
{
  public void OnActionExecuted(ActionExecutedContext context)
  {
    Console.WriteLine("action执行之后");
  }

  public void OnActionExecuting(ActionExecutingContext context)
  {
    Console.WriteLine("action执行之前");
  }
}

IActionFilterは、OnActionExecutedとOnActionExecutingの2つのメソッドを実装する必要があります。 OnActionExecuting は Action の前に実行され、OnActionExecuted は Action の後に実行されます。

原理を理解した後、その機能を使用してコードを簡素化できます。MVC の重要な概念は、モデルの制約を定義し、アクションでモデルが正常にバインドされているかどうかを検証することです。コード


[HttpGet]
public ActionResult Get()
{
  if (!ModelState.IsValid) return BadRequest("参数错误!");
}

このようなコードの繰り返しはコードの複雑さを増すだけでなく、見苦しくなります


public void OnActionExecuting(ActionExecutingContext context)
{
  if (context.ModelState.IsValid) return;

  var modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());
  string errorMsg = modelState.Value.Errors.First().ErrorMessage;
  throw new AppException(errorMsg);
}

モデルバインディングエラーが発生した場合、例外メッセージをスローします。前の章の例外フィルター ExceptionFilter でキャプチャされたエラー情報は、リクエスターに返されます。

ActionFilter の機能を使用して、アクションの実行時間を記録し、アクションの実行時間が遅すぎる場合に警告ログを出力することもできます


public class ActionFilter : IActionFilter
{
  public void OnActionExecuted(ActionExecutedContext context)
  {
    var httpContext = context.HttpContext;
    var stopwach = httpContext.Items[Resources.StopwachKey] as Stopwatch;
    stopwach.Stop();
    var time = stopwach.Elapsed;

    if (time.TotalSeconds > 5)
    {
      var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
      var logger = factory.CreateLogger<ActionExecutedContext>();
      logger.LogWarning($"{context.ActionDescriptor.DisplayName}执行耗时:{time.ToString()}");
    }
  }

  public void OnActionExecuting(ActionExecutingContext context)
  {
    var stopwach = new Stopwatch();
    stopwach.Start();
    context.HttpContext.Items.Add(Resources.StopwachKey, stopwach);
  }
}

上記のコードは、HttpContext を使用して Stopwach を渡し、アクションの実行時間が5秒を超えると警告ログが出力されます。

グローバルフィルターの登録

登録方法はExceptionFinterと同様です。システムのルート ディレクトリで Startup.cs ファイルを見つけて、ConfigureServices を次のように変更します


services.AddMvc(options =>
      {
        options.Filters.Add<ActionFilter>();
      });

以上がasp.net ActionFilter フィルターの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。