Блок 404 Ошибка FavIco в ELMAh - PullRequest
       45

Блок 404 Ошибка FavIco в ELMAh

8 голосов
/ 18 апреля 2009

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

Ответы [ 6 ]

18 голосов
/ 16 октября 2009

Официальная страница elmah Фильтрация ошибок объясняет несколько способов, которыми эта ошибка 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();
    }
}

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

13 голосов
/ 18 апреля 2009

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

5 голосов
/ 22 апреля 2012

Мне удалось заставить 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>
4 голосов
/ 28 января 2011

Дело не в том, что мое веб-приложение запрашивает значок, а в том, что когда я открываю страницу 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 с моим значком, без ошибок:

elmah with favicon.ico

2 голосов
/ 24 февраля 2010

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

routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
1 голос
/ 17 января 2011

Я использовал приведенное выше программное решение Курта Шиндлера (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();
        }
    }
}

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

Спасибо ...

...