2009-10-30 32 views
10

मैंने उच्च और निम्न खोज की है और मुझे सीधा जवाब नहीं मिल रहा है।क्या एक विशेषता की OnActionExecuted विधि हमेशा निष्पादित होती है?

यदि मेरे पास कस्टम विशेषता/फ़िल्टर है, तो OnActionExecuted विधि हमेशा कॉल की जाएगी? यहां तक ​​कि अगर कोई अपवाद फेंक दिया गया है?

उत्तर

3

कम से कम एमवीसी 5 के साथ, @ tvanfosson का जवाब अब सही नहीं है। यह पिछले संस्करणों पर भी लागू हो सकता है।

OnActionExecuted हमेशा कॉल किया जाता है और filterContext.Exception के माध्यम से फेंक दिया गया अपवाद तक पहुंच है। एक कार्रवाई में अपवाद के साथ

टेस्ट मामला:

public class HomeController 
    : Controller 
{ 
    public ActionResult Index() 
    { 
     throw new Exception("Index"); 
    } 
} 

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Foo()); 
     filters.Add(new Bar()); 
    } 
} 

public class Foo 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

public class Bar 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

आउटपुट: एक फिल्टर में अपवाद के साथ

Bar.OnActionExecuting 
Foo.OnActionExecuting 
Exception thrown: 'System.Exception' in WebApplication1.dll 
Foo.OnActionExecuted 
Has exception: True 
Bar.OnActionExecuted 
Has exception: True 

टेस्ट मामले

public class HomeController 
    : Controller 
{ 
    public ActionResult Index() 
    { 
     return new HttpStatusCodeResult(200); 
    } 
} 

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Foo()); 
     filters.Add(new Bar()); 
    } 
} 

public class Foo 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     throw new Exception("Foo"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

public class Bar 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

आउटपुट:

Bar.OnActionExecuting 
Foo.OnActionExecuting 
Foo.OnActionExecuted 
Has exception: False 
Exception thrown: 'System.Exception' in WebApplication1.dll 
Bar.OnActionExecuted 
Has exception: True 
+0

एमवीसी 5 के लिए इसे अद्यतन करने के लिए धन्यवाद! – Patricia

संबंधित मुद्दे