NuGet'te Atif tarafından geliştirilmiş bir çözüm içeren bir ELMAH.MVC paketi ve ayrıca MVC yönlendirme içindeki elmah arayüzünü işleyen bir kontrolör (artık bu ekseni kullanmaya gerek yok)
Bu çözümle ilgili sorun ), bir veya başka bir elmah hata işleyicisinin, hatayı customError etiketi olarak veya ErrorHandler veya kendi hata işleyiciniz aracılığıyla ayarlamak isteyebileceğiniz şeyleri yoksayarak hatayı işlemesi
En iyi çözüm IMHO, diğer tüm filtrelerin sonunda hareket edecek ve zaten işlenmiş olayları günlüğe kaydedecek bir filtre oluşturmaktır. Elmah modülü, uygulama tarafından işlenmeyen diğer hataları kaybetmeye özen göstermelidir. Bu ayrıca sağlık olayını ve hata olaylarına bakmak için asp.net'e eklenebilecek diğer tüm modülleri kullanmanıza izin verir.
Bu görünümlü elmah.mvc içindeki ErrorHandler reflektör ile yazdım
public class ElmahMVCErrorFilter : IExceptionFilter
{
private static ErrorFilterConfiguration _config;
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled) //The unhandled ones will be picked by the elmah module
{
var e = context.Exception;
var context2 = context.HttpContext.ApplicationInstance.Context;
//TODO: Add additional variables to context.HttpContext.Request.ServerVariables for both handled and unhandled exceptions
if ((context2 == null) || (!_RaiseErrorSignal(e, context2) && !_IsFiltered(e, context2)))
{
_LogException(e, context2);
}
}
}
private static bool _IsFiltered(System.Exception e, System.Web.HttpContext context)
{
if (_config == null)
{
_config = (context.GetSection("elmah/errorFilter") as ErrorFilterConfiguration) ?? new ErrorFilterConfiguration();
}
var context2 = new ErrorFilterModule.AssertionHelperContext((System.Exception)e, context);
return _config.Assertion.Test(context2);
}
private static void _LogException(System.Exception e, System.Web.HttpContext context)
{
ErrorLog.GetDefault((System.Web.HttpContext)context).Log(new Elmah.Error((System.Exception)e, (System.Web.HttpContext)context));
}
private static bool _RaiseErrorSignal(System.Exception e, System.Web.HttpContext context)
{
var signal = ErrorSignal.FromContext((System.Web.HttpContext)context);
if (signal == null)
{
return false;
}
signal.Raise((System.Exception)e, (System.Web.HttpContext)context);
return true;
}
}
Şimdi, filtre yapılandırmanızda şöyle bir şey yapmak istiyorsunuz:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//These filters should go at the end of the pipeline, add all error handlers before
filters.Add(new ElmahMVCErrorFilter());
}
İnsanlara gerçekten istisnayı işleyecek küresel bir filtre eklemek istediklerinde, bu son filtreden ÖNCE gitmeleri gerektiğini hatırlatmak için bir yorum bıraktığımıza dikkat edin, aksi takdirde işlenmeyen istisnanın ElmahMVCErrorFilter tarafından yok sayılacağı duruma girersiniz. İşlenmedi ve Elmah modülü tarafından kilitlenmeli, ancak bir sonraki filtre istisnayı işlendi olarak işaretler ve modül onu yok sayar, istisna asla elmah haline gelmez.
Şimdi, webconfig'nizdeki elmah uygulamalarının aşağıdaki gibi olduğundan emin olun:
<add key="elmah.mvc.disableHandler" value="false" /> <!-- This handles elmah controller pages, if disabled elmah pages will not work -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> <!-- This uses the default filter for elmah, set to disabled to use our own -->
<add key="elmah.mvc.requiresAuthentication" value="false" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.allowedRoles" value="*" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.route" value="errortracking" /> <!-- Base route for elmah pages -->
Burada önemli olan "elmah.mvc.disableHandleErrorFilter" dir, bu yanlışsa, elmaE.mvc içindeki customError ayarlarınızı yok sayacak olan varsayılan HandleErrorHandler'ı kullanarak istisnayı işleyecek işleyiciyi kullanır.
Bu kurulum, sınıflar ve görünümlerde kendi ErrorHandler etiketlerinizi ayarlamanıza izin verirken, bu hataları ElmahMVCErrorFilter aracılığıyla kaybederken, elmah modülü aracılığıyla web.config dosyasına özel bir Hata yapılandırması ekleyerek kendi Hata İşleyicilerinizi bile yazmanıza olanak tanır. Yapmanız gereken tek şey, yazdığımız elmah filtresinden önce hatayı işleyecek herhangi bir filtre eklememeyi unutmayın. Ve bahsetmeyi unuttum: elmah'da kopya yok.