Почему Chrome ищет мой favicon.ico, когда я подаю файл из ASP.NET MVC?
У меня есть контроллер в MVC, обслуживающий изображения из базы данных.
EDIT: Это все еще происходит, если я обслуживаю файл полностью стандартными средствами в MVC.
каждый раз, когда я запрашиваю свое изображение, Google Chrome также ищет мой favicon.ico.
чтобы избежать ненужных дискуссий о других вещах "я также должен заботиться о", предположим, что я не забочусь о кэшировании в этом примере, и я всегда буду возвращать HTTP-ответ 200 с этим файлом.
в моем контроллере я возвращаю следующее:
return File(fileBytes, contentType);
после проверки скрипача 2 генерируется следующий ответ:
HTTP / 1.1 200 OK
Кэш-контроль: public
Тип контента: image/gif
ETag: oYu19wKo+KEHkyxZQ2WXAA==
Сервер: Microsoft-IIS / 7.0
X-AspNetMvc-Версия: 1.0
X-AspNet-Версия: 2.0.50727
X-Powered-By: ASP.NET
Дата: Вт, 16 Июня 2009 Года 18: 48: 45 GMT
Контент-Длина: 29344
для сравнения, это ответ в Fiddler от Google, когда я запрашиваю (в первый раз) логотип Google:
HTTP / 1.1 200 OK
Тип контента: image/gif
Последнее изменение: Ср, 07 июня 2006 19:42: 34 GMT
Дата: Вт, 16 июня 2009 18:50: 54 GMT
Истекает: Ср, 16 июня 2010 18:50: 54 GMT
Кэш-контроль: public, max-age=31536000
Сервер: gws
Контент-Длина: 8706
Возраст: 2
однако в Chrome после получения моего изображения Chrome пытается найти мой favicon.ico. Это не попробуйте это после запроса логотипа Google.
есть идеи, почему это может произойти? Из моего понимания HTML, ответ должен быть в заголовке ответа, потому что, конечно, это все, что клиент должен продолжать? Пожалуйста, поправьте меня!
EDIT 2: кажется многие люди совершенно неправильно поняли проблему. проблема не отсутствие favicon и ошибочных запросов в MVC-это проблема запроса favicon, когда загружается только изображение с типом контента "IMAGE/JPEG", в отличие от веб-страницы с типом контента "TEXT / HTML"!!
12 ответов
Это не имеет ничего общего с MVC. Я использую webforms с пользовательской службой журналов, и я наткнулся на этот пост, задаваясь вопросом, почему у меня были непрерывные ошибки "файл не существует" в моих журналах. Это локально на моей машине разработки, у меня нет фавикона.ICO файлы в моих проектах, и я пробовал IE, Firefox и Google, пытаясь увидеть, какой браузер является виновной стороной.
каждый запрос от Google Chrome к моим приложениям делает запрос на favicon.ico. Мне пришлось начните локально регистрировать браузер, чтобы определить, что именно браузер googles является виновником. Я бы связался с google, если это вас беспокоит. Я просто хотел убедиться, что это не какой-то новый троян, заражающий мой хром.
У вас есть favicon? Если нет, возможно, именно поэтому Chrome пытается найти его каждый раз для вашего сайта. Для google он уже имеет кэшированный favicon.
фактический ответ: это известная, проверенная ошибка. *(недавно исправлено!... может быть?)
похоже на известную, давнюю проблему с Chrome: http://crbug.com/39402
если вы хотите, чтобы это было исправлено раньше, звезда вопрос. Больше людей в главной роли проблема, скорее всего, увеличит свой приоритет и, возможно, получить его исправить быстрее.
****обновление 1***: по состоянию на 15 мая этого года (2013)--четыре года после этого вопроса был задан--it похоже, что проблема была исправлена в версии 29: http://crbug.com/39402#c47
не стесняйтесь, чтобы отменить все ваши хаки и обходные пути. :]
****обновление 2 (2015-01)***: это, по-видимому, все еще проблема для некоторых пользователей, согласно той же ссылке проблемы. :/
одна вещь, которую вы можете сделать, это заставить MVC игнорировать любой запрос на *.ico, чтобы вы не получали никаких исключений во время отладки.
должно быть что-то вроде этого:
routes.MapRoute("ignore-favicon", "{*path}", null, new {path = ".*/favicon\.ico"});
этот шаблон URL соответствует всему, но затем мы ограничиваем его только тем, что заканчивается на favicon.ico. (Я не тестировал это)
я столкнулся с этой проблемой некоторое время назад и обошел ее, проигнорировав конкретный маршрут, добавив
routes.IgnoreRoute("{*favicon}", new { favicon = ".*/favicon\.ico" });
в метод RegisterRoutes в Global.асакс.
Мне кажется, что Chrome запрашивает favicon для своих собственных вкладок - я продолжал получать 404s (потому что мой favicon где-то еще, и мои страницы знают это), пока я не сделал некоторые тесты и не понял, что это Chrome делает прямые запросы к файлу favicon. Нет реального исправления, кроме как переписать в реальный файл, я думаю
вы можете добавить что-то подобное в свой 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 файлы
вы должны установить заголовок Expires, чтобы сообщить браузеру, как долго он должен использовать свою локальную копию.
браузер Chrome может работать с сайтом Google по-другому, чем с любым другим сайтом, поэтому сначала я бы рекомендовал проверить, ищет ли он favicon.ico каждый раз где-то еще, например, на StackOverflow.
Я бы также проверил, делает ли Firefox то же самое с вашим сайтом. Думаю, фавикон.ico следует запрашивать только один раз за запуск браузера, даже если его нет на сайте. Это может быть ошибка в версии Chrome, которую вы используете.
этой таким образом, вопрос / ответ объясняет, как обслуживать Favicon в браузере с помощью маршрутов.
важно поместить ссылку на значок в masterpage или некоторые браузеры попытаются найти favicon.ico для всех каталогов, а не только глобально один раз за раз.
<link rel="SHORTCUT ICON" href="<%= Url.Content("~/content/images/rr-favicon.ico") %>"/>
Кажется, панель инструментов google является виновной стороной, судя по моим журналам (и IE6, конечно). Они оба будут делать запросы для каталогов, отличных от root
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)