Elmah: استثناءات بدون httpcontext؟
-
22-09-2019 - |
سؤال
أفرز مؤشر ترابط على application_start وأرغب في تسجيل الاستثناءات. لا يوجد Context/HttpContext/HttpContext.Current
, ، فكيف يمكنني الحصول عليه للتسجيل؟
في الوقت الحالي ، لا يجذب أي استثناء في موضوعاتي وإذا كتبت ErrorSignal.FromCurrentContext().Raise(ex);
أحصل على خطأ حول السياق لا يمكن أن يكون فارغًا.
ربما يمكنني إنشاء httpcontext وهمية ولكن بطريقة ما لا أعتقد أن هذا سيعمل بشكل جيد.
-تعديل- حاولت ErrorSignal.Get(new HttpApplication()).Raise(ex);
ويبدو أنه لا يبدو أن يلتقط هذا الاستثناء.
المحلول
تأكد من تعيين اسم التطبيق الخاص بك في web.config
<errorLog type="Elmah.SqlErrorLog, Elmah"
connectionStringName="nibWeb"
applicationName="Nib.Services" />
وثم
ErrorLog.GetDefault(null).Log(new Error(error));
سيعمل
نصائح أخرى
لم أكن أستخدم <errorLog>
كما هو الحال في إجابة بريندان كاري لأنني كنت فقط في التسجيل في الذاكرة. ومع ذلك ، فقد عمل أمره بشكل رائع في حالتي دون تسمية التطبيق:
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The application has done something.")));
اضطررت إلى إعادة ترجمة Elmah مع .NET 4.0 ، بسبب خطأ في الحاجة إلى system.web.abstractions 3.5.0.0. شوكة مجمعة مقابل .net 4.0 هنا إذا كان أي شخص يريدها (أيضًا تسمية قوية):
لتطبيقي ، لقد حفظت this.Context.ApplicationInstance
في Application_Start
حتى أتمكن من الاتصال Elmah.ErrorSignal.Get
مع مثيل محفوظ. مع ال ErrorSignal
, ، هل يمكنني ذلك Raise
. هذا يمر عبر جميع مرشحات البريد الإلكتروني.
أدناه هو الرمز. أستخدم fluentscheduler
public class Global : HttpApplication {
void Application_Start(object sender, EventArgs e) {
var application = Context.ApplicationInstance;
FluentScheduler.TaskManager.UnobservedTaskException +=
(FluentScheduler.Model.TaskExceptionInformation i, UnhandledExceptionEventArgs a) =>
Elmah.ErrorSignal.Get(application).Raise(i.Task.Exception);
}
}
أضفت حلاً إلى: باستخدام Elmah في تطبيق وحدة التحكم هذا يضيف القدرة على إرسال البريد الإلكتروني والتغريدات والتصفية بالإضافة إلى التسجيل.