Как я могу гарантировать, что динамически генерируемый файл javascript никогда не кэшируется? - PullRequest
2 голосов
/ 17 июля 2010

У меня есть динамически генерируемый файл javascript, который я хочу убедиться, что НИКОГДА не кэшируется браузером.Мой текущий метод состоит в том, чтобы просто добавить (новую) guid к URL-адресу в теге script на каждом просмотре страницы.

Например:

<script type="text/javascript" src="/js/dynamic.js?rand=979F861A-C487-4AA8-8BD6-84E7988BD460"></script>

Мой вопрос ...лучший способ для достижения моей цели?

Для справки, я использую ASP.NET MVC 2, а файл javascript создается в результате действия контроллера.

Ответы [ 6 ]

6 голосов
/ 17 июля 2010

Метод, который у вас есть, работает отлично, альтернативой может быть использование DateTime.UtcNow.Ticks. Конечно, вы можете использовать заголовки управления кешем , но если вы хотите быть абсолютно уверенным , то у вас есть способ пойти.

Хотя, если вы все равно генерируете файл динамически, и вам нужно включить его в страницу ... есть ли причина, по которой вы не просто вставляете JavaScript в страницу? Поскольку вы хотите, чтобы он никогда не кэшировался, это сэкономит клиенту возможность приема-передачи.

2 голосов
/ 17 июля 2010

Вы можете создать атрибут настраиваемого действия:

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        var cache = filterContext.HttpContext.Response.Cache;
        cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        cache.SetValidUntilExpires(false);
        cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        cache.SetCacheability(HttpCacheability.NoCache);
        cache.SetNoStore();
        base.OnResultExecuting(filterContext);
    }
}

, а затем украсить действие контроллера, которое генерирует JavaScript, с помощью этого атрибута:

[NoCache]
public ActionResult MyAction()
{
    ...
}

В этом случае вам больше не нуженслучайная строка, которую вы добавляете.

0 голосов
/ 17 июля 2010

Используйте заголовки HTTP для контроля кэша в ответе.

Cache-Control: no-cache

(Следовательно, это просто настройка сервера, кодирование не требуется.)

В качестве альтернативы, так как вы используете ASP.NET MVC, используйте маршрутизацию, чтобы игнорировать последний элемент URL, в HTML есть

<script type="text/javascript" src="/js/dynamic.js/979F861A-C487-4AA8-8BD6-84E7988BD460"></script>

и используйте маршрут MVC, чтобы игнорировать суффикс (т. Е. Сделать так, чтобы у каждой обслуживаемой HTML-страницы был свой URL-адрес сценария, а не только параметр запроса).

0 голосов
/ 17 июля 2010

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

что-то вроде <script src="{unique string}.js">

0 голосов
/ 17 июля 2010

Вы можете рассмотреть возможность использования HTTP Etags

0 голосов
/ 17 июля 2010

Да, это хорошо. Лично я делаю то же самое, но вместо этого использую метку времени , что гарантирует его уникальность.

...