2017-02-17 11 views
4

Я запускаю одностраничное приложение в IIS и использую библиотеку i18next для переводов в моем приложении. Проблема в том, что иногда, когда я добавляю новые ключевые слова в свой файл translation.json и нажимаю refresh, браузер по-прежнему использует старый файл кеширования перевода, и это приводит к тому, что пользователь видит добавленные ключевые слова, но не переводы. Например. если я добавлю ключевое слово "somekey": "Some text here...", тогда вместо указанного текста будет отображаться somekey.Как отключить кеширование файлов i18next translation.json?

Как мой файл translation.json находится в папке под названием locales так:

locales 
    en 
     translation.json 

Я попытался, добавив следующие настройки в web.config:

<location path="locales"> 
    <system.webServer> 
    <staticContent> 
     <clientCache cacheControlMode="DisableCache" /> 
    </staticContent> 
    </system.webServer> 
</location> 

Однако, когда я смотрел на сетевой трафик с инструментами разработчика Chrome, я заметил, что файл translation.json по-прежнему поступает из кеша, а заголовок Cache-Control: no-cache отсутствует. Почему это не работает? Каков правильный способ отключения кэширования файла?

EDIT: Только что проверил сайт снова, и кажется, что translation.json файл теперь имеет заголовок Cache-Control: no-cache и это на самом деле быть извлечено с сервера каждый раз, когда я обновить эту страницу. На данный момент я думаю, что проблема могла иметь какое-то отношение к нашему процессу выпуска и изменения конфигурации, которые не применяются. Не уверен, хотя.

ответ

1

Я столкнулся с этой же ситуацией, используя combo SPA + i18next + IIS, и заметил, что иногда файлы json не обновлялись.

Основная причина, по которой в какой-то момент это выглядит странно, заключается в том, что вы изменили настройки IIS в web.config ПОСЛЕ того, как файлы уже были кешированы Google Chrome, поскольку первый раз файл был загружается без заголовка Cache-Control.

Причина

Файлы JSON не было представления Cache-Control: нет кэша заголовка, так что после 304 - Not Modified ответ, он начал использовать локальный кэш диска Google Chrome.

Решение

Она была решена

1) Очистка кэша в Google Chrome на вкладке Сеть (очистить все кэш и сделать работу)

enter image description here

2) Размещение веб.конфиг файл на /Locales/ папку со следующими staticContent правилами и location без указания path атрибут:

<?xml version="1.0" encoding="utf-8"?> 
    <configuration> 
     <location> 
      <system.webServer> 
       <staticContent> 
        <clientCache cacheControlMode="DisableCache" /> 
       </staticContent> 
      </system.webServer> 
     </location> 
    </configuration> 

Как указано в the docs о <location> тэгом:

path атрибута

Использование <location> с отсутствующим атрибутом path применяет параметры конфигурации к текущему каталогу и всем дочерним каталогам .


В этом случае я применил правило конкретно в папке /locales/, стремясь не мешать кэширования для другого статического содержимого через веб-сайт, такие как изображения, файлы JavaScript и т.д. ожидаемое поведение может варьироваться в зависимости от потребностей вашего решения.

2

Это на самом деле сложнее, чем кажется. Я предполагаю, что вы используете модуль углового перевода.

я сделал тайник перебора, где он загружает JSon файлы:

$translateProvider.useLoader('$translatePartialLoader', { 
     urlTemplate: 'AppScripts/i18n/{part}-{lang}.json' + '?cb=' + (new Date()).getTime() 
    }); 

Таким образом, он никогда не будет кэшировать языковые файлы, и будет загружать новые на каждом запросе (без обновления страницы или очистить кэш).

Настройка веб-конфигурации полностью игнорируется, я считаю, потому что способ загрузки файлов с помощью ajax-вызовов. Кроме того, json-файлы не могут быть уменьшены с помощью .net-пакета, поскольку ключи будут меняться при сжатии, поэтому вместо «MAIN.FIRSTNAME»: «Имя» у вас будет что-то вроде «abc»: «Имя», и он не будет работать, поскольку представления имеют оригинальные имена.

Вы также можете использовать версию, если вы держите один, бюст кэша только тогда, когда вы выпускаете новую версию, что-то вроде

+ '?v=' + myVersionVar 

вместо того, чтобы использовать текущую временную метку, которая всегда будет загружать файлы при каждом запросе ,

-1

Что делать, если мы включили связывание при развертывании приложения. , как показано ниже.

#if DEBUG BundleTable.EnableOptimizations = false; #else BundleTable.EnableOptimizations = true; #endif

Смежные вопросы