Question

J'ai remarqué de la boîte que ELMAH enregistre un 404 non trouvé pour favico sur mon serveur local. Comment puis-je supprimer cette erreur à travers un filtre? Je ne suis pas familier avec encore .. configurant

Était-ce utile?

La solution

Le ELMAH officiel page d'erreur de filtrage explique un certain nombre de façons cette 404 favicon pourrait être supressed erreur.

Vous pouvez filtrer tous 404 erreurs déclarative dans le web.config comme si. Je ne suis pas certain qu'il existe un moyen de surpress seulement 404 pour un favicon bien.

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

Si vous voulez faire un programme, vous pouvez rejeter l'erreur dans les événements de filtrage ErrorLog ou ErrorEmail comme expliqué dans les documents officiels. Le code ci-dessous est un peu exagéré, mais il montre comment vous pouvez filtrer les uniquement 404 erreurs pour une demande de /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();
    }
}

Je préfère personnellement soit en filtrant tous les 404s déclarative à travers le web.config, ou tout simplement fournir un favicon comme Joel suggère.

Autres conseils

Il ne vous aider à apprendre comment configurer ELMAH, mais la meilleure façon d'empêcher un 404 pour les demandes de favicon est de fournir un ...

Je suis en mesure d'obtenir ELMAH d'ignorer l'erreur en utilisant le code ci-dessous. Vous pouvez éventuellement ajouter d'autres chemins que vous voulez ignorer ainsi. Techniquement, ceux-ci pourraient être des tests séparés mais sur la chance off que je veux ignorer d'autres 404 erreurs dans l'avenir qui sont liés à mon application, je me suis dit que je laisserais ces regroupés car ils ne dépendent pas de ma demande que ce soit et sont ici uniquement pour éliminer le désordre de mon journal des erreurs.

<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>

Bien sûr, si vous êtes inquiet au sujet de ce qui encombrent votre web.config que vous pouvez toujours diviser les filtres dans un fichier dédié.

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

Il est pas que mon application Web demande un favicon, c'est que lorsque je passe en revue à la page elmah.axd, le navigateur demande un favicon.

Soi-disant, cela devrait fonctionner:

<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>

Mais devinez quoi, il ne fonctionne pas.

La seule façon que j'ai trouvé au travail est d'ajouter un favicon.ico à ma racine web. Ce n'est pas pour mon site, il est seulement pour la page elmah.axd. Ne pas besoin d'appeler route.IgnoreRoute.

Voici qui elmah.axd avec mon favicon, et aucune erreur:

ELMAH avec favicon.ico

i ignore simplement la route plutôt que la configuration Elmah. Cela fonctionne pour moi:

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

J'utilisais solution de programmation de Kurt Schindler ci-dessus (vs config); cependant, j'ai remarqué que les non-HttpExceptions ont été jetés obtenir deux fois dans le gestionnaire d'événements ErrorLog_Filtering. Pour éviter cela, assurez-vous de faire un type contrôle sur la méthode GetBaseException. Voici l'extrait

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();
        }
    }
}

Rien de nouveau ici, juste un FYI si vous arrivez à des comportements étranges.

Merci ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top