2015-07-28 18 views
6

C# Web API'mda, global bir istisna eylemcisi eklemeye çalışıyorum. Ben özel durum işlemek ve geri dönmek için ExceptionFilterAttribute özel küresel kullanıyorum bir HttpResponseMessage:Web API OWIN başlangıç ​​istisnası kullanımı

public override void OnException(HttpActionExecutedContext context) 
{ 
    ... 

    const string message = "An unhandled exception was raised by the Web API."; 
    var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError) 
    { 
     Content = new StringContent(message), 
     ReasonPhrase = message 
    }; 
    context.Response = httpResponseMessage; 
} 

Bu kontrolör düzeyinde atılan istisnalar işlemek için ince çalıştı.

Ancak, geliştirme sırasında bir veritabanı bağlantısı sorunu nedeniyle OWIN başlangıç ​​dosyasından atılan bir hata oluştu, ancak, genel istisna eylemcisinden geçmek yerine standart bir IIS istisnası geri döndü ve tam HTML döndürüldü. API tüketicimiz.

Custom ApiControllerActionInvoker:

public class CustomActionInvoker : ApiControllerActionInvoker 
{ 
    public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    { 
     var result = base.InvokeActionAsync(actionContext, cancellationToken); 

     if (result.Exception != null && result.Exception.GetBaseException() != null) 
     { 
      ... 
     } 

     return result; 
    } 
} 

Custom ExceptionHandler:

public class CustomExceptionHandler : ExceptionHandler 
{ 
    public override void Handle(ExceptionHandlerContext context) 
    { 
     ... 

     base.Handle(context); 
    } 

    public override bool ShouldHandle(ExceptionHandlerContext context) 
    { 
     return true; 
    } 
} 

Custom OwinMiddleware bileşen:

benim Owin başlangıçta atılan özel durumları yakalamak için birkaç farklı yaklaşımlar denedim

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) 
     { 
      ... 
     } 
    } 
} 

Ve nihayet sadece Application_Error kullanarak:

protected void Application_Error(object sender, EventArgs e) 
{ 
    ... 
} 

Ama hiçbir şey istisna yakalamak gibi görünüyor.

İstisnai yakalamanın ve HttpResponseMessage değerini döndürmenin bir yolu bilen var mı? Ya da daha önce denediğim yaklaşımlardan herhangi biri işe yarayacaksa?

Herhangi bir yardım çok takdir.

+0

bunların hepsi işe yaramadıysa, bir kez orada bir istisnadır ve orada ateş gerekir AppDomain'.This 'arasında' UnhandledException' olayı abone olabilirsiniz istisnayı ele almak için uygun bir işleyici değildir. –

+0

Yorum için teşekkürler. "Application_Start" yöntemiyle "UnhandledException" öğesine abone olmayı denedim, ancak yakalamıyor gibi görünmüyor. UnhandledException, kesinlikle bir Web API'sı üzerinden çalışır mı? –

+0

belgelere göre, işlenmemiş bir istisna durumunda ateşlenmesi gereken olaydır. –

cevap

2

Bunu doğru yapan bir uygulamam var. Benim durumumda, her zaman çağrı sırasında bir hata oluştuğundan, hizmetin kullanılamayacağını bildiren bir ileti döndüren bir katman sınıf yazdım. Bu sınıf benim çözümümde FailedSetupMiddleware olarak adlandırılıyor. Bunun genel olarak şu şekildedir: Benim Configuration sınıfta

public class FailedSetupMiddleware 
{ 
    private readonly Exception _exception; 

    public FailedSetupMiddleware(Exception exception) 
    { 
     _exception = exception; 
    } 

    public Task Invoke(IOwinContext context, Func<Task> next) 
    { 
     var message = ""; // construct your message here 
     return context.Response.WriteAsync(message); 
    } 
} 

ben bir istisna yapılandırma sırasında atıldı durumunda sadece FailedSetupMiddleware ile Owin boru hattı yapılandıran bir try...catch blok var.

Benim Owin başlangıç ​​sınıfı şuna benzer:

[assembly: OwinStartup(typeof(Startup))] 

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     try 
     { 
      // 
      // various app.Use() statements here to configure 
      // OWIN middleware 
      // 
     } 
     catch (Exception ex) 
     { 
      app.Use(new FailedSetupMiddleware(ex).Invoke); 
     } 
    } 
} 
İlgili konular