15

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

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

每次我请求我的图片时,谷歌浏览器也会搜索我的 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 -作者: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 GMT
到期时间:2010 年 6 月 16 日星期三 18:50 :54 GMT
缓存控制:公共,最大年龄 = 31536000
服务器:gws
内容长度:8706
年龄:2

但是,在 Chrome 中获取我的图像后,Chrome 会尝试找到我的 favicon.ico。请求 Google 徽标后不会尝试此操作

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

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

4

12 回答 12

8

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

Google Chrome 对我的应用程序的每个请求都会请求 favicon.ico。我不得不开始在本地记录浏览器,以确定罪魁祸首实际上是谷歌浏览器。如果它打扰你,我会联系谷歌。我只是想确保它不是感染我的 chrome 的新木马。

于 2009-07-13T12:50:10.567 回答
6

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

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

如果您想尽快修复它,请给问题加注星标。更多人关注该问题可能会提高其优先级,并可能更快地修复它。


****更新 1 ***:截至今年 5 月 15 日(2013 年)——在这个问题被问到四年后——看起来这个问题已经在第 29 版中得到修复:http: //crbug.com /39402#c47

随意撤消所有黑客和解决方法。:]

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

于 2011-04-20T19:54:22.000 回答
4

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

应该是这样的:

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

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

于 2009-06-17T06:25:33.883 回答
4

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

于 2009-06-16T19:29:44.807 回答
2

我不久前遇到了这个问题,并通过添加忽略特定路线来解决它

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

进入 Global.asax 中的 RegisterRoutes 方法。

于 2009-06-17T06:29:48.697 回答
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 文件执行相同的操作

于 2009-12-14T13:46:55.970 回答
1

在我看来,Chrome 为其自己的选项卡请求了一个网站图标——我一直收到 404(因为我的网站图标在其他地方而且我的页面知道),直到我做了一些测试并意识到它是 Chrome 直接向网站图标文件发出请求。除了重写我猜的真实文件之外没有真正的修复

于 2010-12-06T03:38:11.450 回答
0

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

我还会检查 Firefox 是否对您的网站执行相同操作。我认为 favicon.ico 应该在每次浏览器运行时只被请求一次,即使它不存在于网站上。这可能是您使用的 Chrome 版本中的错误。

于 2009-06-17T05:54:01.017 回答
0

这个SO question/answer 解释了如何使用路由将 Favicon 提供给浏览器。

于 2009-07-13T12:55:17.090 回答
0

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

于 2009-06-16T19:34:52.533 回答
0

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

于 2009-06-16T19:37:33.107 回答
0

将 ICON 链接放入您的母版页很重要,否则某些浏览器会尝试为所有目录查找 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)
于 2009-11-21T05:44:20.927 回答