Web Platform

ASP.NET MVC 액션 필터

하얀전쟁^^ 2009. 6. 29. 10:59

액션 필더 이해하기

  

이 장에서 목표는 액션 필더를 설명하는 것이다. 액션 필터는 여러분이 컨트롤러 액션을 응용할 수 있는 속성이다.

ASP.NET MVC 프레임웍은 여러 액션 필터를 포함한다.

l   OutputCache – 이 액션 필터는 특정한 시간을 위한 컨트롤러 액션의 결과를 저장한다.

l   HandleError – 이 액션 필터는 컨트롤러 액션이 실행될 때 발생하는 에러를 잡아낸다.

l   Authorize – 이 액션 필터는 개개인의 사용자 또는 룰을 통해 접근을 제한할 수 있다.

 

여기서는 OutputCache 액션 필터에 대해서만 알아보겠다.

액션 필터는 attribute이다. 각각의 컨트롤러 또는 전체 컨트롤러에서 모두 액션 필터를 적용할 수 있다.

 

다음 예제는  Index() 액션의 결과를 10초동안 저장하는 예제이다.

 

//[OutputCache(Duration = 10)] 사이트소스ㅡㅡ)+ 에러발생아놔~

[OutputCache(Duration = 10, VaryByParam="none")]

public string Index()

{

    return DateTime.Now.ToString("T");

}

 

주소창에 URL /Data/Index입력하고 리플래쉬를 하면 10초동안 동일한 시간을 보게 될 것이다.

 OutputCache 액션 필터를 10초동안 Index() 페이지에 적용시켰다.

 

 

다른 타입의 필터

 

ASP.NET MVC 프레임웍은 4개의 다른 타입의 필터를 제공한다.

1.      Authorization Filters – IauthorizationFilter  속성을 구현

2.      Action Filter - IActionFilter 속성을 구현

3.      Result Filter – IresultFilter 속성을 구현

4.      Exception Filters – IexceptionFilter 속성 구현

 

필터는 위에 나열된 순서대로 실행이 된다.

 

 

Base ActionFilterAttribute Class

 

이 장에서는 여러분이 쉽게 커스텀 액션 필터, ASP.NET framework에 포함된 기본 ActionFilterAttribute 클래스로 구현을 쉽게 만들 것이다. 

이 클래스는 필터 클래스로부터 상속 받는 IActionFilter IResultFilter 인터페이스 둘다 구현을 한다.

 

base ActionFilterAttribute 클래스는 다음과 같은 메서드를 override 할 수 있다.

l   OnActionExecuting – 이 메소드는 컨트롤 액션 전에 실행이 된다.

l   OnActionExecuted – 이 메소드는 컨트롤 액션 후에 실행이 된다.

l   OnResultExecuting – 이 메소드는 컨트롤 액션 결과 전에 실행된다.

l   OnResultExecuted – 이 메소드는 컨트롤 액션 결과 후에 실행된다.

 

 

Creating a Log Action Filter

 

이 장에서는 커스텀 액션 필터를 어떻게 만들지에 대해 설명한다.

우리는 Visual Studio Output 윈도우에 컨트롤 액션의 상태 단계 로그의 커스텀 액션 필터를 만들 것이다.

LogActionFilter Listing2에 포함되어 있다.

 

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

        }

 

    }

}

 

Listing2에서 OnActionExcuting(), OnActionExcuted(), OnResultExecuting(), OnResultExecuted() 메소드를 Log()메소드에서 모두 호출한다.

메소드명과 정확한 라우트 데이터는 Log() 메소드를 통과한다.

Log() 메소드는 Visual Studio Output 윈도우에 메시지를 출력한다. ( 디버그 모드로 )

 

 

 

Home컨트롤러의 Index() 액션이든 아니든 Home컨트롤러에의 모든 액션에 대해서 동작을 한다.

그 동작된 내용을 Output창에 출력이 된다.

 

namespace ExamActionFilter.Controllers

{

    //[HandleError]

    [LogActionFilter]

    public class HomeController : Controller

    {

        public ActionResult Index()

        {

            return View();

        }

 

        public ActionResult About()

        {

            return View();

        }

    }

}

 

여기까지 간단한 액션 필터를 구현하는 것을 배웠다.