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

时间:2009-06-16 19:00:03

标签: asp.net-mvc favicon

我在MVC中有一个控制器,用于提供数据库中的图像。

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

每次我请求我的图片时,Google Chrome都会搜索我的favicon.ico。

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

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

return File(fileBytes, contentType);

检查Fiddler 2后,会生成以下响应:

  

HTTP / 1.1 200 OK
  缓存控制:公共
  内容类型:image / gif
  ETag:oYu19wKo + KEHkyxZQ2WXAA ==
  服务器:Microsoft-IIS / 7.0
  X-AspNetMvc-Version:1.0
  X-AspNet-Version:2.0.50727
  X-Powered-By:ASP.NET
  日期:2009年6月16日星期二18:48:45 GMT
  内容长度:29344

相比之下,当我(第一次)请求Google徽标时,这是来自Google的Fiddler的回复:

  

HTTP / 1.1 200 OK
  内容类型:image / gif
  最后修改日期:2006年6月7日星期三19:42:34 GMT
  日期:2009年6月16日星期二18:50:54格林尼治标准时间   到期日:2010年6月16日星期三18:50:54 GMT
  缓存控制:public,max-age = 31536000
  服务器:gws
  内容长度:8706
  年龄:2岁

但是,在获取我的图片后Chrome浏览器会尝试找到我的favicon.ico。在请求Google徽标后,它尝试此操作。

为什么会发生这种情况的任何想法?根据我对HTML的理解,答案必须在响应头中,因为肯定这是客户端必须继续进行的所有操作?请纠正我!

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

12 个答案:

答案 0 :(得分:7)

这与MVC无关。我正在使用带有自定义构建的日志服务的webforms,我偶然发现这个帖子,想知道为什么我的日志中存在连续的“文件不存在”错误。这是我的开发机器本地,我的项目中没有favicon.ico文件,我尝试过IE,Firefox和Google试图查看哪个浏览器是有罪的一方。

Google Chrome向我的应用发出的每个请求都会请求favicon.ico 。我必须在本地开始记录浏览器,以确定它实际上是googles浏览器,这是罪魁祸首。如果它困扰你我会联系谷歌。我只是想确保它不是一些感染我的chrome的新木马。

答案 1 :(得分:5)

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

Chrome看起来像一个众所周知的长期问题: http://crbug.com/39402

如果你想早点修复它,请解决问题。发表此问题的更多人可能会提高其优先级,并可能更快地修复它。


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

随意撤消所有黑客和变通办法。 :

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

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

应该是这样的:

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

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

答案 4 :(得分:2)

我在一段时间后遇到了这个问题,并通过添加

忽略了特定路线来绕过它
routes.IgnoreRoute("{*favicon}", new { favicon = ".*/favicon\\.ico" });

进入Global.asax中的RegisterRoutes方法。

答案 5 :(得分:1)

您可以在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>

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

答案 6 :(得分:1)

对我来说,Chrome会为自己的标签请求一个favicon - 我一直得到404s(因为我的favicon是其他地方,我的网页知道它),直到我做了一些测试并意识到Chrome是直接向favicon请求文件。没有真正的修复,除了重写真实的文件我猜

答案 7 :(得分:0)

您应该设置Expires标头,告诉浏览器应该使用其本地副本多长时间。

答案 8 :(得分:0)

如果您检查项目设置,则会在某处显示默认图标。删除那个?

答案 9 :(得分:0)

Chrome浏览器可以以与其他网站不同的方式使用Google网站,因此,首先,我建议每次在其他地方查看是否找到favicon.ico,例如,在StackOverflow上。

我还会检查Firefox是否对您的网站做同样的事情。我认为,即使站点上没有浏览器,每个浏览器也应该只请求一次favicon.ico。这可能是您使用的Chrome版本中的错误。

答案 10 :(得分:0)

This所以问题/答案解释了如何使用路线向浏览器提供Favicon。

答案 11 :(得分:0)

将ICON链接放入您的母版页或某些浏览器非常重要,我们会尝试为所有目录找到favicon.ico,而不是每次完成一次全局。

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

似乎google工具栏是我的日志(当然还有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)