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