2015-02-24 5 views
11

मैं Owin स्व होस्टिंग और WebAPI का उपयोग कर सरल सर्वर लिखा है:ओविन में डिफ़ॉल्ट अनचाहे अपवाद आउटपुट को ओवरराइड कैसे करें?

namespace OwinSelfHostingTest 
{ 
    using System.Threading; 
    using System.Web.Http; 
    using Microsoft.Owin.Hosting; 
    using Owin; 

    public class Startup 
    { 
     public void Configuration(IAppBuilder builder) 
     { 
      var config = new HttpConfiguration(); 

      config.Routes.MapHttpRoute(
       "Default", 
       "{controller}/{id}", 
       new { id = RouteParameter.Optional } 
       ); 

      builder.UseWebApi(config); 
     } 
    } 

    public class Server 
    { 
     private ManualResetEvent resetEvent = new ManualResetEvent(false); 
     private Thread thread; 

     private const string ADDRESS = "http://localhost:9000/"; 

     public void Start() 
     { 
      this.thread = new Thread(() => 
       { 
        using (var host = WebApp.Start<Startup>(ADDRESS)) 
        { 
         resetEvent.WaitOne(Timeout.Infinite, true); 
        } 
       }); 
      thread.Start(); 
     } 

     public void Stop() 
     { 
      resetEvent.Set(); 
     } 
    } 

} 

जब नियंत्रक में अपवाद नहीं है, तो Owin इस तरह एक्सएमएल प्रतिक्रिया लौटाता:

<Error> 
    <Message>An error has occurred.</Message> 
    <ExceptionMessage>Attempted to divide by zero.</ExceptionMessage> 
    <ExceptionType>System.DivideByZeroException</ExceptionType> 
    <StackTrace> 
     ... 
    </StackTrace> 
</Error> 

लेकिन मैं विभिन्न उत्पादन चाहते हैं - तो मैं इसे कैसे ओवरराइड कर सकता हूं?

public class CustomExceptionMiddleware : OwinMiddleware 
{ 
    public CustomExceptionMiddleware(OwinMiddleware next) : base(next) 
    {} 

    public override async Task Invoke(IOwinContext context) 
    { 
     try 
     { 
      await Next.Invoke(context); 
     } 
     catch(Exception ex) 
     { 
      // Custom stuff here 
     } 
    } 
} 

और स्टार्टअप पर यह हुक:

+1

उत्पादन किस तरह आप देख रहे हैं:

तो, @ द्वारा प्रदान समाधान करने के लिए इस संशोधन के साथ युवाल-itzchakov आप अंतर्निहित अपवाद पर कब्जा करने में सक्षम हो जाएगा? – abatishchev

उत्तर

8

आप एक Owin मिडलवेयर बनाने और पाइप लाइन में hooking द्वारा ऐसा करने के

public class Startup 
{ 
    public void Configuration(IAppBuilder builder) 
    { 
     var config = new HttpConfiguration(); 

     config.Routes.MapHttpRoute(
      "Default", 
      "{controller}/{id}", 
      new { id = RouteParameter.Optional } 
      ); 

     builder.Use<CustomExceptionMiddleware>().UseWebApi(config); 
    } 
} 

इस तरह किसी भी बिना क्रिया का अपवाद अपने मिडलवेयर द्वारा पकड़ा हो जाएगा और आपको आउटपुट परिणाम को कस्टमाइज़ करने की अनुमति देता है।

एक महत्वपूर्ण बात नोट करने के लिए: अगर बात होस्ट किया जा रहा एक अपवाद अपने आप के तर्क से निपटने है, वेबएपीआई करता है, अपवाद प्रचार नहीं करेंगे। यह हैंडलर किसी भी अपवाद के लिए है जो होस्ट की जा रही अंतर्निहित सेवा से अनचाहे है।

+0

@ डार्थवीडर - वास्तव में क्या काम नहीं करता है? –

+7

बीटीडब्ल्यू जो काम नहीं करता है। अगला कॉल करने पर। इन्वोक() कैच ब्लॉक कभी ट्रिगर नहीं होता है। मेरी खोज पर इस पर ठोकर खाई जानना अच्छा होगा कि यह कैसे करें। अपवाद निहित है संदर्भ या शब्दकोश प्रकट नहीं होता है। –

+0

@DrSchizo ठीक है, अगर आपका अपवाद वेबएपीआई द्वारा संभाला गया है, तो निश्चित रूप से आप इसे यहां नहीं देख पाएंगे, क्योंकि यह पहले से ही संभाला गया है और कहा गया ढांचा के अंदर निहित है। –

2

जब आप एसिंक विधि का इंतजार करते हैं, तो एक अपवाद कॉलर के संदर्भ में नहीं फेंक दिया जाएगा, लेकिन कॉलर को वापस किए गए कार्य का निरीक्षण करके उपलब्ध होगा।

var subtask = Next.Invoke(context); 

await subtask; 

if (subtask.Exception != null) 
{ 
    // log subtask.Exception here 
} 
+1

यदि कोई 'कार्य' या 'कार्य ' अपवाद फेंकता है, तो यह निश्चित रूप से 'प्रतीक्षा' बिंदु पर प्रचारित होगा। आपको ऐसा क्यों लगता है कि यह नहीं होगा? –

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