>  기사  >  백엔드 개발  >  asp.net ActionFilter 필터

asp.net ActionFilter 필터

巴扎黑
巴扎黑원래의
2017-09-01 14:41:371736검색

이 기사에서는 주로 asp.net 코어 MVC 필터의 ActionFilter 필터를 자세히 소개하며, 이는 특정 참조 값을 가지고 있습니다. 관심 있는 친구들은 이를 참조할 수 있습니다.

이 시리즈에서는 asp.net 코어 MVC에 내장된 필터의 사용에 대해 설명합니다. 다음 장으로 나뉩니다

 asp.net 코어 MVC 필터 - ExceptionFilter 필터(1)

 asp.net 코어 MVC 필터 - ActionFilter 필터(2)

 asp.net 코어 MVC 필터 ResultFilter 필터(3)

asp.net core MVC 필터 ResourceFilter 필터 (4)

 asp.net core MVC 필터 AuthorizationFilter 필터 (5)

Introduction

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이라는 두 가지 메서드를 구현해야 합니다. OnActionExecuting은 Action 전에 실행되고 OnActionExecuted는 Action 후에 실행됩니다.

원칙을 알고 나면 해당 기능을 사용하여 코드를 단순화할 수 있습니다. MVC의 중요한 개념은 모델 제약 조건을 정의한 다음 Action에서 모델이 성공적으로 바인딩되었는지 확인합니다. code


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

이렇게 반복되는 코드는 코드의 복잡성을 증가시킬 뿐만 아니라 보기에도 좋지 않습니다. ActionFilter에서 자동으로 완성할 수 있습니다


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의 기능을 사용하여 Action의 실행 시간을 기록하고, Action 실행 시간이 너무 느릴 경우 경고 로그를 출력할 수도 있습니다.


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.