작업 필터 이해(C#)
이 자습서의 목표는 작업 필터를 설명하는 것입니다. 작업 필터는 작업이 실행되는 방식을 수정하는 컨트롤러 작업 또는 전체 컨트롤러에 적용할 수 있는 특성입니다.
작업 필터 이해
이 자습서의 목표는 작업 필터를 설명하는 것입니다. 작업 필터는 작업이 실행되는 방식을 수정하는 컨트롤러 작업 또는 전체 컨트롤러에 적용할 수 있는 특성입니다. ASP.NET MVC 프레임워크에는 다음과 같은 몇 가지 작업 필터가 포함되어 있습니다.
- OutputCache – 이 작업 필터는 지정된 시간 동안 컨트롤러 작업의 출력을 캐시합니다.
- HandleError – 이 작업 필터는 컨트롤러 작업이 실행될 때 발생하는 오류를 처리합니다.
- 권한 부여 – 이 작업 필터를 사용하면 특정 사용자 또는 역할에 대한 액세스를 제한할 수 있습니다.
사용자 고유의 사용자 지정 작업 필터를 만들 수도 있습니다. 예를 들어 사용자 지정 인증 시스템을 구현하기 위해 사용자 지정 작업 필터를 만들 수 있습니다. 또는 컨트롤러 작업에서 반환된 뷰 데이터를 수정하는 작업 필터를 만들 수도 있습니다.
이 자습서에서는 처음부터 작업 필터를 빌드하는 방법을 알아봅니다. 작업 처리의 여러 단계를 Visual Studio 출력 창에 기록하는 로그 작업 필터를 만듭니다.
작업 필터 사용
작업 필터는 특성입니다. 개별 컨트롤러 작업 또는 전체 컨트롤러에 대부분의 작업 필터를 적용할 수 있습니다.
예를 들어 목록 1의 데이터 컨트롤러는 현재 시간을 반환하는 라는 Index()
작업을 노출합니다. 이 작업은 작업 필터로 데코레이트 OutputCache
됩니다. 이 필터를 사용하면 작업에서 반환된 값이 10초 동안 캐시됩니다.
목록 1 – Controllers\DataController.cs
using System;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
public class DataController : Controller
{
[OutputCache(Duration=10)]
public string Index()
{
return DateTime.Now.ToString("T");
}
}
}
브라우저의 Index()
주소 표시줄에 URL /Data/Index를 입력하고 새로 고침 단추를 여러 번 눌러 작업을 반복적으로 호출하는 경우 10초 동안 동일한 시간이 표시됩니다. 작업의 출력 Index()
은 10초 동안 캐시됩니다(그림 1 참조).
그림 01: 캐시된 시간(전체 크기 이미지를 보려면 클릭)
목록 1에서 단일 작업 필터인 OutputCache
작업 필터가 메서드에 Index()
적용됩니다. 필요한 경우 동일한 작업에 여러 작업 필터를 적용할 수 있습니다. 예를 들어 및 HandleError
작업 필터를 OutputCache
모두 동일한 작업에 적용할 수 있습니다.
목록 1 OutputCache
에서 작업 필터가 작업에 적용 Index()
됩니다. 클래스 자체에 이 특성을 적용할 DataController
수도 있습니다. 이 경우 컨트롤러에서 노출하는 모든 작업에서 반환된 결과는 10초 동안 캐시됩니다.
다양한 유형의 필터
ASP.NET MVC 프레임워크는 다음과 같은 네 가지 유형의 필터를 지원합니다.
- 권한 부여 필터 – 특성을 구현합니다
IAuthorizationFilter
. - 작업 필터 – 특성을 구현합니다
IActionFilter
. - 결과 필터 – 특성을 구현합니다
IResultFilter
. - 예외 필터 – 특성을 구현합니다
IExceptionFilter
.
필터는 위에 나열된 순서대로 실행됩니다. 예를 들어 권한 부여 필터는 작업 필터 및 예외 필터가 항상 다른 모든 유형의 필터 후에 실행되기 전에 항상 실행됩니다.
권한 부여 필터는 컨트롤러 작업에 대한 인증 및 권한 부여를 구현하는 데 사용됩니다. 예를 들어 권한 부여 필터는 권한 부여 필터의 예입니다.
작업 필터에는 컨트롤러 작업이 실행되기 전과 후에 실행되는 논리가 포함됩니다. instance 대한 작업 필터를 사용하여 컨트롤러 작업이 반환하는 뷰 데이터를 수정할 수 있습니다.
결과 필터에는 뷰 결과가 실행되기 전과 후에 실행되는 논리가 포함됩니다. 예를 들어 보기가 브라우저에 렌더링되기 직전에 보기 결과를 수정할 수 있습니다.
예외 필터는 마지막으로 실행할 필터 유형입니다. 예외 필터를 사용하여 컨트롤러 작업 또는 컨트롤러 작업 결과에 의해 발생한 오류를 처리할 수 있습니다. 예외 필터를 사용하여 오류를 기록할 수도 있습니다.
각 필터 유형은 특정 순서로 실행됩니다. 동일한 형식의 필터가 실행되는 순서를 제어하려면 필터의 Order 속성을 설정할 수 있습니다.
모든 작업 필터의 기본 클래스는 클래스입니다 System.Web.Mvc.FilterAttribute
. 특정 유형의 필터를 구현하려는 경우 기본 Filter 클래스에서 상속하고 , , IActionFilter
IResultFilter
또는 IExceptionFilter
인터페이스 중 IAuthorizationFilter
하나 이상을 구현하는 클래스를 만들어야 합니다.
기본 ActionFilterAttribute 클래스
사용자 지정 작업 필터를 더 쉽게 구현할 수 있도록 ASP.NET MVC 프레임워크에는 기본 ActionFilterAttribute
클래스가 포함됩니다. 이 클래스는 및 IResultFilter
인터페이스를 IActionFilter
모두 구현하고 클래스에서 Filter
상속합니다.
여기서 용어는 완전히 일치하지 않습니다. 기술적으로 ActionFilterAttribute 클래스에서 상속되는 클래스는 작업 필터와 결과 필터입니다. 그러나 느슨한 의미에서 작업 필터라는 단어는 ASP.NET MVC 프레임워크의 모든 형식의 필터를 참조하는 데 사용됩니다.
기본 ActionFilterAttribute
클래스에는 재정의할 수 있는 다음 메서드가 있습니다.
- OnActionExecuting – 컨트롤러 작업이 실행되기 전에 이 메서드가 호출됩니다.
- OnActionExecuted – 컨트롤러 작업이 실행된 후 이 메서드가 호출됩니다.
- OnResultExecuting – 컨트롤러 작업 결과가 실행되기 전에 이 메서드가 호출됩니다.
- OnResultExecuted – 컨트롤러 작업 결과가 실행된 후 이 메서드가 호출됩니다.
다음 섹션에서는 이러한 각 메서드를 구현하는 방법을 살펴보겠습니다.
로그 작업 필터 만들기
사용자 지정 작업 필터를 빌드하는 방법을 설명하기 위해 컨트롤러 작업을 처리하는 단계를 Visual Studio 출력 창에 기록하는 사용자 지정 작업 필터를 만듭니다. 목록 LogActionFilter
2에 포함되어 있습니다.
목록 2 – ActionFilters\LogActionFilter.cs
using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1.ActionFilters
{
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}
private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
Debug.WriteLine(message, "Action Filter Log");
}
}
}
목록 2에서 , OnActionExecuting()
, OnResultExecuting()
OnActionExecuted()
및 OnResultExecuted()
메서드는 모두 메서드를 호출합니다Log()
. 메서드의 이름과 현재 경로 데이터가 메서드에 Log()
전달됩니다. 메서드는 Log()
Visual Studio 출력 창에 메시지를 씁니다(그림 2 참조).
그림 02: Visual Studio 출력 창에 쓰기(전체 크기 이미지를 보려면 클릭)
목록 3의 홈 컨트롤러는 로그 작업 필터를 전체 컨트롤러 클래스에 적용하는 방법을 보여 줍니다. 홈 컨트롤러에서 노출하는 작업( Index()
메서드 또는 About()
메서드)이 호출될 때마다 작업 처리 단계가 Visual Studio 출력 창에 기록됩니다.
목록 3 – Controllers\HomeController.cs
using System.Web.Mvc;
using MvcApplication1.ActionFilters;
namespace MvcApplication1.Controllers
{
[LogActionFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
return View();
}
}
}
요약
이 자습서에서는 MVC 작업 필터를 ASP.NET 소개했습니다. 권한 부여 필터, 작업 필터, 결과 필터 및 예외 필터의 네 가지 필터 유형에 대해 알아보았습니다. 기본 ActionFilterAttribute
클래스에 대해서도 알아보았습니다.
마지막으로 간단한 작업 필터를 구현하는 방법을 알아보았습니다. 컨트롤러 작업을 처리하는 단계를 Visual Studio 출력 창에 기록하는 로그 작업 필터를 만들었습니다.