Вопрос

Я сразу заметил, что ELMAH регистрирует 404, не найденных для favico, на моем локальном сервере.Как мне подавить эту ошибку с помощью фильтра?Я еще не очень хорошо знаком с его настройкой..

Это было полезно?

Решение

Официальный elmah Страница фильтрации ошибок объясняет несколько способов устранения этой ошибки 404 favicon.

Вы могли бы отфильтровать ВСЕ 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();
    }
}

Лично я бы предпочел либо отфильтровать все 404-е файлы декларативно через web.config, либо просто указать значок, как предлагает Джоэл.

Другие советы

Это не поможет вам узнать, как настроить ELMAH, но самый простой способ предотвратить 404 для запросов на значок - это предоставить его...

Я смог заставить ELMAH проигнорировать ошибку, используя приведенный ниже код.Потенциально вы могли бы добавить любые другие пути, которые вы также хотите игнорировать.Технически это могут быть отдельные тесты, но на тот случай, если в будущем я захочу игнорировать другие ошибки 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>

Но знаете что, это не так.

Единственный способ, который я нашел для работы, - это добавить значок.ico в мой веб-корень.Это не для моего сайта, это только для страницы elmah.axd.НЕ нужно вызывать route.Игнорируйте route.

Вот elmah.axd с моим значком, и никаких ошибок:

elmah with favicon.ico

я просто игнорирую маршрут, а не настраиваю Elmah.Это работает для меня:

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

Я использовал программное решение Курта Шиндлера выше (vs config);однако я заметил, что исключения, отличные от HttpExceptions, дважды выдавались в обработчике события 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();
        }
    }
}

Здесь нет ничего нового, просто К вашему сведению, если вы случайно увидите какое-то странное поведение.

Спасибо...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top