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.
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. –
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ı? –
belgelere göre, işlenmemiş bir istisna durumunda ateşlenmesi gereken olaydır. –