سؤال

أحاول تكوين 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:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top