2012-12-12 14 views
14

मैं एमवीसी 4 में वैश्विक अपवाद हैंडलर को कैसे कार्यान्वित कर सकता हूं क्योंकि यह एमवीसी 3 से अलग प्रतीत होता है।एमवीसी 4 ग्लोबल अपवाद फ़िल्टर कैसे कार्यान्वित करें?

सुनिश्चित नहीं हैं कि निम्नलिखित लागू करने के लिए कैसे:

public class ErrorHandlerAttribute: System.Web.Mvc.FilterAttribute, 
            IExceptionFilter 
{ 
    public Task ExecuteExceptionFilterAsync(
      HttpActionExecutedContext actionExecutedContext, 
      CancellationToken cancellationToken) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+3

यह आदमी कैसे MVC में एक वैश्विक अपवाद संचालक बनाने के लिए पर एक बहुत अच्छा पूर्वाभ्यास है: http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc –

उत्तर

27

दुर्भाग्य से एरिक Leschinski के commet में दिए गए लिंक केवल पता चलता System.Web.Mvc.IExceptionFilter इंटरफ़ेस, और नहीं System.Web.Http.Filters.IExceptionFilter इंटरफ़ेस को लागू करने के लिए कैसे। पहला नियमित एमवीसी नियंत्रकों में प्रयोग किया जाता है, जबकि दूसरे लक्ष्य ApiCotrollers

यहाँ एक सरल वर्ग उदाहरण मैं बिना क्रिया अपवाद मेरी ApiControllers में फेंक दिया प्रवेश करने के लिए साथ आए हैं:

public class ExceptionLoggerFilter: IExceptionFilter 
{ 
    public ExceptionLoggerFilter(Logger logger) 
    { 
     this.logger = logger; 
    } 

    public bool AllowMultiple { get { return true; } } 

    public Task ExecuteExceptionFilterAsync(
      HttpActionExecutedContext actionExecutedContext, 
      CancellationToken cancellationToken) 
    { 
     return Task.Factory.StartNew(() => 
     { 
      logger.Error("web service error", actionExecutedContext.Exception); 
     }, cancellationToken); 
    } 

    private Logger logger; 
} 

और यह सब आप इस फिल्टर को सक्षम करने के क्या करना है तुम्हारा Global.asax Application_Start विधि में इसे पंजीकृत है :

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    // allocate filter and add it to global configuration 
    var exceptionLogger = new ExceptionLoggerFilter(Container.Get<Logger>()); 
    GlobalConfiguration.Configuration.Filters.Add(exceptionLogger); 

    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
} 

मुझे आशा है कि इससे अन्य googlers वहां मदद मिलेगी!

+0

तुम भी हो सकता है global.asax फ़ाइल में applcation_Error को लागू करें यदि यह आपके लिए काम करता है –

+1

आप Task.Factory.StartNew क्यों कहते हैं? क्या यह कार्य के समान है। रुन? http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html –

+1

वास्तव में किसी विशेष कारण के लिए देखें। कॉलिंग * टास्क.रुन * कुछ डिफ़ॉल्ट पैरामीटर (http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx) में गुजरने के लिए * टास्क.फैक्टरी.स्टार्टन्यू * के बराबर है। लेकिन आप सही हैं, क्योंकि * टास्क.रुन * विधि .NET Framework 4.5 में पेश की गई थी, यह निष्पादन के लिए कार्य निर्धारित करने का अनुशंसित तरीका बन गया है। –

11

तरह से मैं इसके बारे में MVC भाग के लिए अपवाद संचालक बनाया है, मैं एक वर्ग कि IExceptionFilter

कार्यान्वित
public class MVCExceptionFilter : IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     Trace.TraceError(filterContext.Exception.ToString()); 
    } 
} 

बनाया फिर आप के अंदर protected void Application_Start()

Global.asax.cs में यह रजिस्टर पद्धति पहले से ही आप इस लाइन जोड़ने की आवश्यकता होगी,

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

तो पंक्ति है ऊपर यह

GlobalFilters.Filters.Add(new MVCExceptionFilter()); 
+0

में मेरे पास दोनों एमवीसी और एपीआई नियंत्रक भी हैं, इसलिए मुझे दोनों फ़िल्टरों को लागू करने की आवश्यकता है, वे अनिवार्य रूप से वही करते हैं, इसलिए मैंने इसे एक सेवा वर्ग में लगाया। –

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