ขณะนี้มีแพ็คเกจ ELMAH.MVC ใน NuGet ที่รวมโซลูชันที่ปรับปรุงโดย Atif และคอนโทรลเลอร์ที่จัดการอินเตอร์เฟส elmah ภายในการกำหนดเส้นทาง MVC (ไม่จำเป็นต้องใช้ axd นั้นอีกต่อไป)
ปัญหาเกี่ยวกับโซลูชันนั้น (และกับโซลูชั่นทั้งหมดที่นี่ ) ก็คือวิธีหนึ่งหรืออีกวิธีหนึ่งที่ตัวจัดการข้อผิดพลาด elmah กำลังจัดการข้อผิดพลาดโดยไม่สนใจสิ่งที่คุณอาจต้องการตั้งค่าเป็นแท็ก customError หรือผ่าน ErrorHandler หรือตัวจัดการข้อผิดพลาดของคุณเอง
ทางออกที่ดีที่สุด IMHO คือการสร้างตัวกรองที่จะทำงานในตอนท้ายของตัวกรองอื่น ๆ ทั้งหมดและบันทึกเหตุการณ์ที่ได้รับการจัดการแล้ว โมดูล elmah ควรดูแลการบันทึกข้อผิดพลาดอื่น ๆ ที่ไม่ได้จัดการโดยแอปพลิเคชัน สิ่งนี้จะช่วยให้คุณใช้โปรแกรมตรวจสอบสุขภาพและโมดูลอื่น ๆ ทั้งหมดที่สามารถเพิ่มลงใน asp.net เพื่อดูเหตุการณ์ข้อผิดพลาด
ฉันเขียนสิ่งนี้โดยใช้ตัวสะท้อนที่ ErrorHandler ภายใน elmah.mvc
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;
}
}
ตอนนี้ในการกำหนดค่าตัวกรองของคุณคุณต้องการทำสิ่งนี้:
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());
}
ขอให้สังเกตว่าฉันทิ้งความคิดเห็นไว้ที่นั่นเพื่อเตือนผู้คนว่าถ้าพวกเขาต้องการเพิ่มตัวกรองทั่วโลกที่จะจัดการกับข้อยกเว้นมันควรจะไปก่อนที่ตัวกรองสุดท้ายนี้มิฉะนั้นคุณจะทำงานในกรณีที่ ElmahMVCErrorFilter ไม่ได้รับการจัดการและควรถูกบันทึกไว้โดยโมดูล Elmah แต่ตัวกรองถัดไปทำเครื่องหมายข้อยกเว้นว่าจัดการแล้วและโมดูลจะไม่สนใจมันส่งผลให้ข้อยกเว้นไม่เคยทำให้เป็น Elmah
ตอนนี้ตรวจสอบให้แน่ใจว่า appsettings สำหรับ elmah ใน webconfig ของคุณมีลักษณะดังนี้:
<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 -->
สิ่งสำคัญที่นี่คือ "elmah.mvc.disableHandleErrorFilter" ถ้านี่เป็นเท็จมันจะใช้ตัวจัดการภายใน elmah.mvc ที่จริงจะจัดการข้อยกเว้นโดยใช้ HandleErrorHandler เริ่มต้นที่จะไม่สนใจการตั้งค่า customError ของคุณ
การตั้งค่านี้ช่วยให้คุณสามารถตั้งค่าแท็ก ErrorHandler ของคุณเองในคลาสและมุมมองในขณะที่ยังบันทึกข้อผิดพลาดผ่าน ElmahMVCErrorFilter เพิ่มการกำหนดค่า customError ไปยัง web.config ผ่านโมดูล elmah แม้กระทั่งการเขียน Error Handler ของคุณเอง สิ่งเดียวที่คุณต้องทำคืออย่าลืมเพิ่มตัวกรองใด ๆ ที่จะจัดการกับข้อผิดพลาดก่อนที่ตัวกรอง elmah ที่เราเขียน และฉันลืมที่จะพูดถึง: ไม่มีการซ้ำซ้อนใน elmah