【问题标题】:Block 404 FavIco error in ELMAhELMAh 中的块 404 FavIco 错误
【发布时间】:2010-10-20 05:13:12
【问题描述】:

我注意到 ELMAH 在我的本地服务器上记录了一个 404 not found for favico。如何通过过滤器抑制此错误?我对配置它还不是很熟悉..

【问题讨论】:

    标签: logging http-status-code-404 elmah


    【解决方案1】:

    它不能帮助您了解如何配置 ELMAH,但防止 404 请求网站图标的最简单方法是提供一个...

    【讨论】:

      【解决方案2】:

      官方 elmah Error Filtering page 解释了可以抑制此 404 图标错误的多种方法。

      您可以像这样在 web.config 中以声明方式过滤掉 所有 404 错误。不过,我不确定是否有办法只为网站图标抑制 404。

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

      如果您想以编程方式执行此操作,您可以消除 ErrorLog 或 ErrorEmail 过滤事件中的错误,如官方文档中所述。下面的代码有点矫枉过正,但它演示了如何为 /favicon.ico 请求过滤 only 404 错误。

      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 以声明方式过滤所有 404,或者像 Joel 建议的那样只提供一个网站图标。

      【讨论】:

      • 这可以完成这项工作,但我不建议过滤 all 404 错误。这在某种程度上限制了 ELMAH 的力量。我更赞成 Joel 的方法,您可以真正解决问题。
      • 哈哈!我刚去了……哦,是的,我实际上可以添加一个网站图标!
      【解决方案3】:

      我只是忽略路由而不是配置 Elmah。这对我有用:

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

      【讨论】:

      • 你确定你真的用ELMAH检查过这个吗?忽略路线是行不通的。它只是导致请求被 MVC 忽略并传递到对其进行 404 处理的常规 ASP.NET 管道,导致它被记录在 ELMAH 中。
      • 自从我查看该代码以来已经有一段时间了,所以我需要仔细检查,但我在一个实时站点上使用了该技术,它似乎对我有用。 IIS6和IIS7有区别吗?
      • 您是否需要它取决于服务器配置。对于 Cassini(Visual Studio 调试),这些 404 由 Elmah 记录。对于 IIS 6,如果路由忽略它们,Elmah 不会看到它们。我没有测试过 IIS 7。
      • 我终于重新检查了这个,你是对的,它确实作为 404 传递。
      【解决方案4】:

      我在上面使用了 Kurt Schindler 的编程解决方案(与配置相比);但是,我注意到在 ErrorLog_Filtering 事件处理程序中两次抛出非 HttpExceptions。为避免这种情况,请确保对 GetBaseException 方法进行类型检查。这是sn-p

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

      这里没有什么新鲜事,如果您碰巧看到一些奇怪的行为,仅供参考。

      谢谢...

      【讨论】:

        【解决方案5】:

        并不是我的网络应用程序在请求一个网站图标,而是当我浏览到 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,没有错误:

        【讨论】:

        • 嘿,马特,您需要确保在 httpModule 和 system.webServer 模块中注册 ErrorFilter - 并且需要在 ErrorLog 处理程序(或任何其他日志记录模块)之后注册它们- 这是一个反向堆栈,优先级。
        【解决方案6】:

        通过使用下面的代码,我能够让 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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-20
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          • 2012-11-04
          • 1970-01-01
          • 2013-06-12
          • 1970-01-01
          相关资源
          最近更新 更多