代码之家  ›  专栏  ›  技术社区  ›  joshcomley

当我从ASP.NET MVC提供文件时,为什么Chrome会搜索favicon.ico?

  •  13
  • joshcomley  · 技术社区  · 15 年前

    我在MVC中有一个控制器为数据库中的图像提供服务。

    编辑: 如果我在MVC中提供一个完全超过标准方法的文件,这仍然会发生。

    每次我请求我的图片,谷歌Chrome也会搜索我的favicon.ico。

    为了避免不必要的关于其他事情的讨论,“我也应该关心”让我们假设在这个例子中我不关心缓存,我将始终返回HTTP响应200和文件。

    在我的控制器中,我返回以下内容:

    return File(fileBytes, contentType);
    

    检查完小提琴2后,将生成以下响应:

    HTTP/1.1 200 OK
    缓存控制:公共
    内容类型:image/gif
    电子标签:Oyu19wko+Kehkyxzq2wxaa==
    服务器:Microsoft IIS/7.0
    X-ASPNETMVC-版本:1.0
    X-ASPNET-版本:2.0.50727
    x-powered-by:asp.net
    日期:2009年6月16日星期二18:48:45格林尼治标准时间
    内容长度:29344

    相比之下,这是我(第一次)请求Google徽标时Google的fiddler响应:

    HTTP/1.1 200 OK
    内容类型:image/gif
    上次修改时间:2006年6月7日星期三19:42:34格林威治标准时间
    日期:2009年6月16日星期二18:50:54格林尼治标准时间
    有效期至:2010年6月16日星期三18:50:54格林威治标准时间
    缓存控制:公共,最大年龄=31536000
    服务器:GWS
    内容长度:8706
    年龄:2岁

    然而,在Chrome中,在获取我的图像后,Chrome试图找到我的favicon.ico。它确实 在请求Google徽标后尝试此操作。

    你知道为什么会这样吗?从我对HTML的理解来看,答案必须在响应头中,因为这确实是客户机必须要做的全部工作?请纠正我!

    编辑2: 似乎很多人完全误解了这个问题。 问题是 MVC中缺少favicon和错误请求——这是在仅加载图像时请求favicon的问题,内容类型为“image/jpeg”,而不是内容类型为“text/html”的网页!!

    12 回复  |  直到 9 年前
        1
  •  7
  •   TombMedia    11 年前

    这与MVC无关。我正在使用一个定制的日志服务的webforms,我偶然发现了这篇文章,想知道为什么我的日志中有连续的“文件不存在”错误。这在我的开发机器上,我的项目中没有favicon.ico文件,我尝试过ie、firefox和google来看看哪个浏览器是有罪的一方。

    从Google Chrome到我的应用程序的每个请求都会请求favicon.ico。 . 我不得不开始在本地登录浏览器,以确定真正的罪魁祸首是谷歌浏览器。如果谷歌打扰你的话,我会联系它的。我只是想确定不是新的特洛伊木马感染了我的铬。

        2
  •  4
  •   Vilx-    15 年前

    你有驼背吗?如果没有,也许这就是为什么Chrome每次都试图在你的网站上找到它。对于谷歌来说,它已经缓存了favicon。

        3
  •  4
  •   Noyo    9 年前

    实际答案是:这是一个已知的、经过验证的错误。*( 最近修好了!…也许吧?)

    看起来像是铬的一个已知的、长期存在的问题: http://crbug.com/39402

    如果你想早点解决问题,那就在问题上加上星号。更多的人主演这个问题,可能会增加它的优先权,并可能得到更快的解决。


    ****更新1**:截至今年5月15日(2013年)--在提出此问题4年后--看起来问题已在版本29中修复: http://crbug.com/39402#c47

    请随意撤销所有的黑客攻击和解决方法。:]

    ****更新2(2015-01)***:根据同一问题链接,对于某些用户来说,这显然仍然是一个问题。:

        4
  •  3
  •   Haacked    15 年前

    您可以做的一件事是让MVC忽略对*.ico的任何请求,这样在调试时就不会得到任何异常。

    应该是这样的:

    routes.MapRoute("ignore-favicon", "{*path}", null, new {path = ".*/favicon\\.ico"});
    

    该URL模式匹配所有内容,但我们将其约束为只匹配以favicon.ico结尾的内容。(我还没有测试过这个)

        5
  •  2
  •   hakon    15 年前

    我不久前就遇到了这个问题,通过添加

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

    进入global.asax中的registerRoutes方法。

        6
  •  1
  •   Joshua    14 年前

    在我看来,Chrome请求一个favicon作为它自己的标签-我一直得到404(因为我的favicon在其他地方,我的页面知道它),直到我做了一些测试,并意识到它是Chrome直接向favicon文件提出请求。除了重写真正的文件之外没有真正的修复

        7
  •  1
  •   Martin Buberl    13 年前

    您可以在 web.config 文件以确保 favicon.ico 缓存在客户端上,并且不是每次都被请求。

    <location path="favicon.ico">
        <system.webServer>
            <httpProtocol>
                <customHeaders>
                    <add name="Cache-Control" value="public, max-age=31536000" />
                 </customHeaders>
            </httpProtocol>
        </system.webServer>
    </location>
    

    您可以/应该对任何images/.js和css文件执行相同的操作。

        8
  •  0
  •   dso    15 年前

    您应该设置Expires头来告诉浏览器使用本地副本的时间。

        9
  •  0
  •   mhenrixon    15 年前

    如果您检查您的项目设置,它会在某处显示默认图标。移除它?

        10
  •  0
  •   Alexander Prokofyev    15 年前

    Chrome浏览器可以与Google站点以另一种方式工作,而不是与任何其他站点一起工作,因此,首先,我建议检查它是否每次在其他地方寻找favicon.ico,例如stackoverflow。

    我也会检查火狐是否在你的网站上做同样的事情。我认为,即使favicon.ico不在网站上,每个浏览器运行一次也应该只请求一次。这可能是您使用的Chrome版本中的错误。

        11
  •  0
  •   Community Reversed Engineer    7 年前

    This 因此,问题/答案解释了如何使用路由为浏览器提供Favicon服务。

        12
  •  0
  •   Simon_Weaver    15 年前

    重要的是将图标链接放入母版页,或者某些浏览器将尝试为所有目录查找favicon.ico,而不是每次完成一次全局链接。

     <link rel="SHORTCUT ICON" href="<%= Url.Content("~/content/images/rr-favicon.ico") %>"/>
    

    从我的日志来看,谷歌工具栏似乎是有罪的一方(当然还有IE6)。它们都将请求根目录以外的目录

     Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
     Mozilla/4.0 (compatible; GoogleToolbar 6.2.1910.1554; Windows 6.0; MSIE 8.0.6001.18828)