문서를 영문으로 보려면 영문 확인란을 선택하세요. 마우스 포인터를 텍스트 위로 이동시켜 팝업 창에서 영문 텍스트를 표시할 수도 있습니다.
번역
영문

ASP.NET MVC의 필터링

ASP.NET MVC에서 컨트롤러는 작업 메서드를 정의하며 이 메서드는 일반적으로 링크 클릭 또는 양식 제출 등의 가능한 사용자 상호 작용과 일대일 관계에 있습니다. 예를 들어, 사용자가 링크를 클릭할 경우 지정된 컨트롤러로 요청이 라우팅되고 해당하는 작업 메서드가 호출됩니다.

작업 메서드가 호출되기 이전 또는 작업 메서드가 실행된 이후에 논리를 수행하고 싶을 경우가 있을 수 있습니다. 원하는 시점에 논리를 수행할 수 있도록 지원하기 위해 ASP.NET MVC에서는 필터를 제공합니다. 필터는 작업 이전 및 작업 이후의 동작을 컨트롤러 작업 메서드에 추가할 수 있는 선언적 방법과 프로그래밍 방법을 제공하는 사용자 지정 클래스입니다.

이 항목에 수반되는 Visual Studio 프로젝트 및 소스 코드를 다운로드하십시오.

ASP.NET MVC에서는 다음과 같은 작업 필터 형식을 지원합니다.

  • 권한 부여 필터. IAuthorizationFilter 를 구현하며, 작업 메서드를 실행할지 여부와 관련하여 인증 수행 또는 요청의 속성에 대한 유효성 검사 등의 보안 결정을 내립니다. 권한 부여 필터의 예로 AuthorizeAttribute 클래스와 RequireHttpsAttribute 클래스가 있습니다. 권한 부여 필터는 다른 모든 필터 전에 실행됩니다.

  • 작업 필터. IActionFilter 를 구현하고 작업 메서드 실행을 래핑합니다. IActionFilter 인터페이스는 OnActionExecutingOnActionExecuted 메서드를 선언합니다. OnActionExecuting 은 작업 메서드 전에 실행됩니다. OnActionExecuted 는 작업 메서드 후에 실행되며, 작업 메서드에 추가 데이터를 제공하거나 반환 값을 검사하거나 작업 메서드 실행을 취소하는 등의 추가적인 처리를 수행할 수 있습니다.

  • 결과 필터. IResultFilter 를 구현하고 ActionResult 개체의 실행을 래핑합니다. IResultFilter OnResultExecutingOnResultExecuted 메서드를 선언합니다. OnResultExecuting ActionResult 개체가 실행되기 전에 실행됩니다. OnResultExecuted 는 결과 후에 실행되며 결과에 대해 HTTP 응답 수정과 같은 추가적인 처리를 수행할 수 있습니다. 결과 필터의 예로 OutputCacheAttribute 클래스가 있습니다.

  • 예외 필터. IExceptionFilter 를 구현하고 ASP.NET MVC 파이프라인의 실행 중에 throw되는 처리되지 않은 예외가 있는 경우 실행됩니다. 예외 필터는 로깅 또는 오류 페이지 표시 등의 작업에 사용될 수 있습니다. 예외 필터의 예로 HandleErrorAttribute 클래스가 있습니다.

Controller 클래스는 각각의 필터 인터페이스를 구현합니다. 컨트롤러의 On<Filter> 메서드를 재정의하여 특정 컨트롤러의 필터를 구현할 수 있습니다. 예를 들어 OnAuthorization 메서드를 재정의할 수 있습니다. 다운로드할 수 있는 샘플에 포함된 Simple 컨트롤러는 각 필터를 재정의하고 각 필터가 실행될 때 진단 정보를 기록합니다. 컨트롤러에서 다음 On<Filter> 메서드를 구현할 수 있습니다.

ASP.NET MVC에는 특성으로 구현된 다음과 같은 필터가 포함되어 있습니다. 작업 메서드, 컨트롤러 또는 응용 프로그램 수준에서 필터를 적용할 수 있습니다.

  • AuthorizeAttribute . 인증과 권한 부여(선택 사항)에 의해 액세스를 제한합니다.

  • HandleErrorAttribute . 작업 메서드에서 throw되는 예외를 처리하는 방법을 지정합니다.

    참고참고:

    이 필터는 customErrors 요소가 Web.config 파일에서 사용하도록 설정되지 않은 경우 예외를 catch하지 않습니다.

  • OutputCacheAttribute . 출력 캐싱을 제공합니다.

  • RequireHttpsAttribute . 보안되지 않은 HTTP 요청을 강제로 HTTPS를 통해 다시 보냅니다.

다음과 같은 방식으로 필터를 만들 수 있습니다.

  • 컨트롤러의 On<Filter> 메서드 중 하나 이상을 재정의합니다.

  • ActionFilterAttribute 에서 파생되는 특성 클래스를 만들고 컨트롤러나 작업 메서드에 특성을 적용합니다.

  • 필터 공급자(FilterProviders 클래스)를 사용하여 필터를 등록합니다.

  • GlobalFilterCollection 클래스를 사용하여 전역 필터를 등록합니다.

필터는 추상 ActionFilterAttribute 클래스를 구현할 수 있습니다. AuthorizeAttribute 등의 일부 필터는 FilterAttribute 클래스를 직접 구현합니다. 권한 부여 필터는 작업 메서드가 실행되기 전에 항상 호출되고 다른 모든 필터 형식 전에 호출됩니다. OutputCacheAttribute 등의 다른 작업 필터는 추상 클래스 ActionFilterAttribute를 구현하며 이 구현을 통해 작업 필터는 작업 메서드 실행 이전 또는 이후에 실행될 수 있습니다.

작업 메서드 또는 컨트롤러를 사용하여 필터 특성을 선언적으로 사용할 수 있습니다. 이 특성으로 컨트롤러를 표시할 경우 작업 필터는 해당 컨트롤러의 모든 작업 메서드에 적용됩니다.

다음 예제에서는 HomeController 클래스의 기본 구현을 보여 줍니다. 이 예제에서 HandleError 특성은 컨트롤러를 표시하는 데 사용됩니다. 따라서 필터는 해당 컨트롤러의 모든 작업 메서드에 적용됩니다.


[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}


여러 필터 공급자를 등록할 수 있습니다. 필터 공급자는 정적 Providers 속성을 사용하여 등록됩니다. GetFilters(ControllerContext, ActionDescriptor) 메서드는 모든 공급자의 필터를 단일 목록에 집계합니다. 공급자는 어떠한 순서로든 등록할 수 있습니다. 공급자가 등록되는 순서는 필터가 실행되는 순서에 영향을 미치지 않습니다.

참고참고:

필터 공급자는 ASP.NET MVC 3의 새로운 기능입니다.

기본적으로 ASP.NET MVC에서는 다음과 같은 필터 공급자를 등록합니다.

GetFilters 메서드는 서비스 로케이터의 모든 IFilterProvider 인스턴스를 반환합니다.

필터는 다음과 같은 순서로 실행됩니다.

  1. 권한 부여 필터

  2. 작업 필터

  3. 응답 필터

  4. 예외 필터

예를 들어 권한 부여 필터가 가장 먼저 실행되고 예외 필터는 마지막으로 실행됩니다. 각 필터 형식 내에서 Order 값은 실행 순서를 지정합니다. 각 필터 형식 및 순서 내에서 Scope 열거형 값은 필터의 순서를 지정합니다. 이 열거형은 다음과 같은 필터 범위 값을 정의합니다. 이 값은 실행되는 순서대로 나열되어 있습니다.

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

예를 들어 Order 속성이 0으로 설정되고 필터 범위가 First로 설정된 작업 필터는 Order 속성이 0으로 설정되고 필터 범위가 Action으로 설정된 작업 필터보다 먼저 실행됩니다.

형식, 순서 및 범위가 동일한 필터의 실행 순서는 정의되어 있지 않습니다.

OnActionExecuting(ActionExecutingContext) , OnResultExecuting(ResultExecutingContext)OnAuthorization(AuthorizationContext) 필터는 정방향 순서로 실행됩니다. OnActionExecuted(ActionExecutedContext) , OnResultExecuting(ResultExecutingContext)OnException(ExceptionContext) 필터는 역방향 순서로 실행됩니다.

참고참고:

ASP.NET MVC 버전 3에서 Order 값이 동일한 예외 필터의 실행 순서가 변경되었습니다. ASP.NET MVC 2 및 이전 버전에서 작업 메서드의 예외 필터와 Order 값이 동일한 컨트롤러의 예외 필터는 작업 메서드의 예외 필터 전에 실행됩니다. 일반적으로 이는 예외 필터가 지정된 Order 값 없이 적용되는 경우에 해당합니다. ASP.NET MVC 3에서는 가장 특정한 예외 처리기가 가장 먼저 실행되도록 이 순서가 반대로 변경되었습니다. 자세한 내용은 이 문서 뒷부분의 필터 순서 단원을 참조하십시오.

OnActionExecuting OnResultExecuting 메서드에서 Result 속성을 null이 아닌 값으로 설정하여 필터 실행을 취소할 수 있습니다. 보류 중인 모든 OnActionExecutedOnActionExecuting 필터는 호출되지 않으며 호출자는 취소된 필터나 보류 중인 필터에 대해 OnActionExecuted 메서드를 호출하지 않습니다. 이전에 실행된 필터에 대한 OnActionExecuted 필터가 실행되고, 모든 OnResultExecutingOnResultExecuted 필터가 실행됩니다.

예를 들어 Home 컨트롤러와 Simple 컨트롤러가 있는 ASP.NET MVC 응용 프로그램의 경우, 전역 요청 타이밍 필터가 응용 프로그램에 적용됩니다. 요청 타이밍 필터는 4가지 작업 및 결과 필터(OnActionExecuting, OnActionExecuted, OnResultExecutingOnResultExecuted)를 구현합니다. 응용 프로그램의 각 필터 메서드는 필터 이름, 컨트롤러 이름, 작업 이름 및 필터 형식이 포함된 추적 정보를 기록합니다. 이 경우 필터 형식은 요청 타이밍 필터입니다. Home 컨트롤러의 Index 작업에 대한 요청은 추적 수신기(디버그 창)에서 다음과 같은 출력을 나타냅니다.

필터 메서드

컨트롤러

작업

필터 형식

OnActionExecuting

Home

Index

요청 타이밍 필터

OnActionExecuted

Home

Index

요청 타이밍 필터

OnResultExecuting

Home

Index

요청 타이밍 필터

OnResultExecuted

Home

Index

요청 타이밍 필터

추적 작업 필터가 Simple 컨트롤러에 적용되는 동일한 응용 프로그램의 경우를 생각해보겠습니다. Simple 컨트롤러도 4가지 작업 및 결과 필터를 구현합니다. Simple 컨트롤러에는 3가지 필터가 있는데 각 필터는 4가지 작업 및 결과 메서드를 구현합니다. Simple 컨트롤러의 Details 작업에 대한 요청은 추적 수신기에서 다음과 같은 출력을 나타냅니다.

필터 메서드

컨트롤러

작업

필터 형식

OnActionExecuting

Simple

Details

Simple 컨트롤러

OnActionExecuting

Simple

Details

추적 작업

OnActionExecuting

Simple

Details

요청 타이밍

OnActionExecuted

Simple

Details

요청 타이밍

OnActionExecuted

Simple

Details

추적 작업

OnActionExecuted

Simple

Details

Simple 컨트롤러

OnResultExecuting

Simple

Details

Simple 컨트롤러

OnResultExecuting

Simple

Details

추적 작업

OnResultExecuting

Simple

Details

요청 타이밍

OnResultExecuted

Simple

Details

요청 타이밍

OnResultExecuted

Simple

Details

추적 작업

OnResultExecuted

Simple

Details

Simple 컨트롤러

이제 다음 예제와 같이 추적 작업 필터가 결과 속성을 "Home/Index"로 설정하는 동일한 응용 프로그램을 생각해보겠습니다.

if (filterContext.RouteData.Values.ContainsValue("Cancel")) {
    filterContext.Result = new RedirectResult("~/Home/Index");
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}

취소된 결과가 있는 Simple 컨트롤러의 Details 작업에 대한 요청은 추적 수신기에서 다음과 같은 출력을 나타냅니다.

필터 메서드

컨트롤러

작업

필터 형식

OnActionExecuting

Simple

Details

Simple 컨트롤러

OnActionExecuting

Simple

Details

추적 작업

OnActionExecuted

Simple

Details

Simple 컨트롤러

OnResultExecuting

Simple

Details

Simple 컨트롤러

OnResultExecuting

Simple

Details

추적 작업

OnResultExecuting

Simple

Details

요청 타이밍

OnResultExecuted

Simple

Details

요청 타이밍

OnResultExecuted

Simple

Details

추적 작업

OnResultExecuted

Simple

Details

Simple 컨트롤러

OnActionExecuting

Home

Index

요청 타이밍 필터

OnActionExecuted

Home

Index

요청 타이밍 필터

OnResultExecuting

Home

Index

요청 타이밍 필터

OnResultExecuted

Home

Index

요청 타이밍 필터

이 항목의 다운로드할 수 있는 샘플은 이러한 표에서 설명하는 필터링을 구현합니다.

필터 상태를 필터 인스턴스에 저장하지 마십시오. 요청별 상태는 일반적으로 Items 속성에 저장됩니다. 이 컬렉션은 요청마다 빈 것으로 초기화되고 요청이 완료되면 삭제됩니다. 임시 사용자별 상태는 일반적으로 사용자의 세션에 저장됩니다. 사용자 상태 정보는 흔히 데이터베이스에 저장됩니다. 이 항목의 다운로드할 수 있는 샘플에는 요청별 상태를 사용하는 타이밍 필터가 포함되어 있습니다. 상태 저장 필터를 만드는 방법에 대한 자세한 내용은 Advanced MVC 3 비디오를 참조하십시오.

제목

설명

ASP.NET MVC 3 Service Location, Part 4: Filters

(블로그 항목) 서비스 위치 컨텍스트에서 ASP.NET MVC 필터에 대해 설명합니다.

AuthorizeAttribute

Authorize 특성을 사용하여 작업 메서드에 대한 액세스를 제어하는 방법에 대해 설명합니다.

OutputCacheAttribute

OutputCache 특성을 사용하여 작업 메서드에 대해 출력 캐싱을 제공하는 방법에 대해 설명합니다.

HandleErrorAttribute

HandleError 특성을 사용하여 작업 메서드에서 throw한 예외를 처리하는 방법에 대해 설명합니다.

사용자 지정 작업 필터 만들기

사용자 지정 작업 필터를 구현하는 방법에 대해 설명합니다.

방법: 사용자 지정 작업 필터 만들기

사용자 지정 작업 필터를 ASP.NET MVC 응용 프로그램에 추가하는 방법에 대해 설명합니다.

커뮤니티 추가 항목

추가
표시: