Arka fon
Bir istemci için bir API Hizmet Katmanı geliştiriyorum ve tüm hataları küresel olarak yakalayıp günlüğe kaydetmem istendi.
Yani, bilinmeyen bir son nokta (veya eylem) gibi bir şey ELMAH kullanılarak veya aşağıdakilere böyle bir şey ekleyerek kolayca ele alınabilir Global.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
. . Yönlendirme ile ilgili olmayan .unhandled hataları günlüğe kaydedilmez. Örneğin:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
Ayrıca, [HandleError]
bu filtreyi kaydederek özniteliği ayarlamayı denedim :
filters.Add(new HandleErrorAttribute());
Ancak bu aynı zamanda tüm hataları günlüğe kaydetmez.
Sorun / Soru
/test
Bunları günlüğe kaydedebilmem için yukarıda çağrılarak oluşturulan hata gibi hataları nasıl kesebilirim? Görünüşe göre bu cevap açık olmalı ama şimdiye kadar aklıma gelen her şeyi denedim.
İdeal olarak, hata günlüğüne, istekte bulunan kullanıcının IP adresi, tarih, saat vb. Gibi bazı şeyler eklemek istiyorum. Ayrıca, bir hatayla karşılaşıldığında destek personeline otomatik olarak e-posta gönderebilmek istiyorum. Bütün bunlar sadece bu hataları meydana geldiklerinde arayabilirsem yapabilirim!
ÇÖZÜLDÜ!
Cevabını kabul ettiğim Darin Dimitrov sayesinde bunu anladım. WebAPI yok değil normal bir MVC denetleyicisi aynı şekilde hataları işlemek.
İşte işe yarayan:
1) Ad alanınıza özel bir filtre ekleyin:
public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is BusinessException)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(context.Exception.Message),
ReasonPhrase = "Exception"
});
}
//Log Critical errors
Debug.WriteLine(context.Exception);
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent("An error occurred, please try again or contact the administrator."),
ReasonPhrase = "Critical Exception"
});
}
}
2) Şimdi filtreyi genel olarak WebApiConfig sınıfına kaydedin :
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
config.Filters.Add(new ExceptionHandlingAttribute());
}
}
VEYA kaydı atlayabilir ve tek bir denetleyiciyi [ExceptionHandling]
öznitelikle dekore edebilirsiniz .