Elmah - تصفية 404 أخطاء
سؤال
أحاول تكوين Elmah لتصفية الأخطاء 404 وأنا أواجه صعوبات في قواعد التصفية المقدمة من XML في ملف web.config الخاص بي. تابعت البرنامج التعليمي هنا و هنا وأضاف <is-type binding="BaseException" type="System.IO.FileNotFoundException" />
إعلان تحت بلدي <test><or>...
إعلان ، لكن ذلك فشل تمامًا.
عندما اختبرته محليًا ، علقت نقطة توقف فيها void ErrorLog_Filtering() {}
من Global.asax ووجدت أن System.Web.HttpException
لا يبدو أن إطلاق النار من قبل ASP.NET لـ 404 يحتوي على نوع أساسي من System.IO.FileNotFound
, ، ولكن بالأحرى هو ببساطة System.Web.HttpException
. لقد اختبرت هذا عن طريق الاتصال e.Exception.GetBaseException().GetType()
في معالج الأحداث.
بعد ذلك قررت تجربة أ <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
على أمل أن يتم ترشيح أي رسالة استثناء تطابق نمط "الملف" /foo.ext "" ، ولكن هذا أيضًا ليس له أي تأثير. كملاذ أخير حاولت <is-type binding="BaseException" type="System.Exception" />
, ، وحتى هذا تم تجاهله بالكامل.
أنا أميل إلى الاعتقاد بأن هناك خطأ في التكوين مع Elmah ، لكنني أخفق في رؤية أي شيء. هل أفتقد شيئًا واضحًا بشكل صارخ؟
إليك الأشياء ذات الصلة من الويب الخاص بي. config:
<configuration>
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"/>
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah"/>
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>
</configSections>
<elmah>
<errorFilter>
<test>
<or>
<equal binding="HttpStatusCode" value="404" type="Int32" />
<regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
</or>
</test>
</errorFilter>
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/logs/elmah" />
</elmah>
<system.web>
<httpModules>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
</modules>
</system.webServer>
</configuration>
المحلول
لقد كان بالفعل خطأ في التكوين ، وليس مجرد خطأ كان واضحًا بشكل خاص.
يعد الترتيب الذي يتم فيه تسجيل Elmah Httpmodules مصدر قلق ذي صلة لأنه لكي يقوم Elmah بتصفية الاستثناء ، يجب عليها أولاً معرفة الوحدات النمطية التي ستستهلك الاستثناء. يجب تسجيل errorfilter httpmodule لمنع الوحدات النمطية الأخرى من معالجة الاستثناء الذي يتم ترشيحه. هذا يبدو لي [نوع] للخلف بالنسبة لي ، ولكن على الأقل يعمل.
<configuration>
...
<system.web>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
</modules>
</system.webServer>
</configuration>
بعد مراجعة إدخال Elmah Wiki على errorfiltering مرة أخرى ، اكتشفت هذه المعلومات الصغيرة من المعلومات الذي يستحق حقًا u003Cstrong /> علامة ، إذا سألتني. (يحرر: لقد قاموا بجريئة منذ أن أجبت على هذا السؤال لأول مرة ؛ الدعائم!)
الخطوة الأولى هي تكوين وحدة إضافية تسمى elmah.errorfiltermodule. تأكد من إضافته بعد أي من وحدات التسجيل من Elmah ، كما هو موضح هنا مع ErrorLogModule: