2015-01-16 1 views
2

ASP.NET MVC 프로젝트의 컨트롤러 내부에서 예외 처리를 위해 PostSharp aspect를 사용하고 있습니다. 단순화 된 코드는 다음과 같다 : 나는 OnExceptionAspect 클래스에서 상속 클래스 ExceptionAspect메소드에서 여러 return 문을 사용하여 PostSharp에서 예외 aspect를 적용하는 방법은 무엇입니까?

[ExceptionAspect(AspectPriority = 1)] 
public ActionResult MarkeSettings() 
{ 
    try{ 
     SaveData(); 
     NotifyUser("success"); 
     return RedirectToAction("A"); 
    } 
    catch(Exception ex){ 
     NotifyUser(ex.Message); 
     return RedirectToAction("B"); 
    } 
} 

. OnException(MethodExecutionArgs args) 방법에서는 args.FlowBehavior = FlowBehavior.Continue;을 설정합니다.

try/catch 블록을 제거하고 프로그램 실행 흐름을 제어하고 ReturnRedirectToAction()에 대해 적절한 조치를 취하려면 어떻게해야합니까? Sharing state between advices에 대해 읽었지 만 문제에 적용하는 방법을 알 수 없습니다.

답변

2

컨트롤러 메서드에 ExceptionAspect을 적용하면 try/catch 블록으로 메서드를 래핑하고 도입 된 catch 블록에서 OnException(MethodExecutionArgs args)을 호출합니다.

이것은 일반적인 예외 처리 코드를 catch 블록에서 aspect 내부의 OnException 메소드로 옮길 수 있음을 의미합니다. 예외가 발생하면 사용자를 특정 작업으로 리디렉션하려고한다고 가정합니다. RedirectToActionRedirectToRouteResult을 반환하는 컨트롤러의 보호 된 메서드입니다. 따라서 OnException 메서드에서 올바른 RedirectToRouteResult 인스턴스를 생성하고 반환해야합니다. 메서드의 반환 값을 변경하려면 args.ReturnValue을 원하는 값으로 설정하고 args.FlowBehavior에서 FlowBehavior.Return으로 설정합니다. 컨트롤러 메소드에 적용

[Serializable] 
public class RedirectOnExceptionAttribute : OnExceptionAspect 
{ 
    public string ToAction { get; set; } 

    public override void OnException(MethodExecutionArgs args) 
    { 
     // NotifyUser(args.Exception.Message); 

     args.FlowBehavior = FlowBehavior.Return; 

     object controller = ((ControllerBase) args.Instance).ControllerContext.RouteData.Values["controller"]; 
     args.ReturnValue = new RedirectToRouteResult(
      new RouteValueDictionary 
       { 
        {"action", this.ToAction}, 
        {"controller", controller} 
       }); 
    } 
} 

:

[RedirectOnException(ToAction = "B")] 
public ActionResult MarkeSettings() 
{ 
    SaveData(); 
    NotifyUser("success"); 
    return RedirectToAction("A"); 
} 
+0

이 비동기 액션 메소드에서 작동하지 않습니다

는 아래 OnExceptionAspect 구현의 예입니다. args.FlowBehavior는 무시됩니다. – Saeid