سؤال

لقد لاحظت خارج الصندوق أن إيملة سجلت 404 غير موجودة ل Favico على خادمي المحلي. كيف يمكنني قمع هذا الخطأ من خلال مرشح؟ أنا لست على دراية بتكوينه بعد ..

هل كانت مفيدة؟

المحلول

المهد الرسمي خطأ في تصفية الصفحة يشرح عدة طرق يمكن أن يكون هذا الخطأ 404 فافيسون مكتظرا.

يمكنك تصفية الخروج الكل 404 أخطاء تم تعريفها في Web.config مثل ذلك. لست متأكدا من أن هناك طريقة لسحق 404 فقط للحصول على فافيسون رغم ذلك.

<errorFilter>
    <test>
        <equal binding="HttpStatusCode" value="404" type="Int32" />
    </test>
</errorFilter>

إذا كنت تريد القيام بذلك برمجيا، فيمكنك رفض الخطأ في أحداث تصفية ErrorLog أو Erroremail كما هو موضح في المستندات الرسمية. الرمز أدناه هو مبالغة قليلا، لكنه يوضح كيف يمكنك تصفية الخروج فقط 404 أخطاء لطلب /favicon.ico.

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404
       && ((HttpContext)e.Context).Request.Path == "/favicon.ico")
    {
        e.Dismiss();
    }
}

كنت شخصيا أفضل إما تصفية جميع الأربعينيات من خلال Web.config، أو فقط توفير فافيسون مثل Joel يقترح.

نصائح أخرى

لا يساعدك على تعلم كيفية تكوين الهما، ولكن أسهل طريقة لمنع 404 لطلبات Favicon هي تقديم واحدة ...

تمكنت من الحصول على إلمح لتجاهل الخطأ باستخدام الرمز أدناه. يمكنك إضافة أي مسارات أخرى تريد تجاهلها أيضا. من الناحية الفنية، قد تكون هذه الاختبارات منفصلة ولكن على فرصة قبالة أريد أن أتجاهل أخطاء 404 أخرى في المستقبل مرتبطة بتطبيقي، وأحسبت أنني سأترك هذه مجمعة معا لأنها لا تعتمد على طلبي على الإطلاق وما هي هنا فقط لإزالة الفوضى من تسجيل الخطأ الخاص بي.

<errorFilter>
    <test>
        <or>
            <and>
                <equal binding="HttpStatusCode" value="404" type="Int32" />
                <equal binding="Context.Request.Path" value="/favicon.ico" type="string" />
            </and>
            <and>
                <equal binding="HttpStatusCode" value="404" type="Int32" />
                <equal binding="Context.Request.Path" value="/robots.txt" type="string" />
            </and>
        </or>
    </test>
</errorFilter>

بالطبع إذا كنت قلقا بشأن هذا التشهير Web.config، فيمكنك دائما تقسيم المرشحات إلى ملف مخصص.

<elmah>
    <security allowRemoteAccess="1" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" />
    <errorFilter configSource="elmahFilters.config" />
</elmah>

ليس هذا هو تطبيق الويب الخاص بي يطلب فافيسون، فهذا عندما أتعاود إلى صفحة Elmah.axd، يطلب المتصفح فافيسون.

من المفترض أن هذا يجب أن يعمل:

<elmah>
  <errorFilter>
  <test>
      <and>
          <equal binding="HttpStatusCode" 
                 value="404" type="Int32" />
          <regex binding="Context.Request.ServerVariables['URL']" 
                 pattern="/favicon\.ico(\z|\?)" />
      </and>
  </test>
 </errorFilter>
</elmah>

لكن تخمين ما، لا.

الطريقة الوحيدة التي وجدتها للعمل هي إضافة Favicon.ico إلى جذر الويب الخاص بي. هذا ليس لموقعي، إنه فقط لصفحة Elmah.axd. لا تحتاج إلى الاتصال Route.ignoreroute.

إليك Elmah.axd مع Favicon، وليس أخطاء:

elmah with favicon.ico

أنا فقط أتجاهل الطريق بدلا من تكوين الهما. هذا يعمل بالنسبة لي:

routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});

كنت أستخدم الحل البرمجي ل Kurt Schindler أعلاه (VS Config)؛ ومع ذلك، لاحظت أن إلقاء فحوصات غير المتشددين قد تم طرحها مرتين في معالج ErrorLog_Filtering. لتجنب ذلك، تأكد من القيام بفحص من النوع في طريقة GetBaseException. ها هي القصاص

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (e.Exception.GetBaseException() is HttpException)
    {
        if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404
            && ((HttpContext)e.Context).Request.Path == "/favicon.ico")
        {
            e.Dismiss();
        }
    }
}

لا شيء جديد هنا، فقط FYI إذا حدث أن ترى بعض السلوك الغريب.

شكرا...

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