Кеш для asmx / js не сохраняется - PullRequest
3 голосов
/ 24 февраля 2012

Как я могу постоянно кэшировать вызов asmx / js?Я попробовал с HTTPModule и реализовал кеширование.Но это значение кэша истекает при следующем входе в систему.Сбрасывается на год назад с даты последнего изменения.Через код я этого не делаю.Есть ли в asmx настройки по умолчанию для этого?Если да, есть ли способ переопределить настройку?

Я использовал приведенный ниже код для достижения этой цели.На самом деле мое требование состоит в том, чтобы кэшировать этот вызов (GetMygrid.asmx / js) в кеше браузера на несколько дней и избежать ответа 304.Я могу кешировать этот вызов с помощью HTTPModule.

private void EndRequest(object sender, EventArgs e)
{
    HttpApplication application = (HttpApplication)sender;
    HttpContext context = application.Context;           

    var path = context.Request.Path.ToLower().Replace('\\', '/');

    if (path.EndsWith("/js") || path.EndsWith("/jsdebug") )
    {
        var lastModified = DateTime.UtcNow;
        var expires = lastModified + TimeSpan.FromDays(5);

        context.Response.Cache.SetLastModified(lastModified);
        context.Response.Cache.SetExpires(expires); 
        context.Response.Cache.SetCacheability(HttpCacheability.Public);

    }
}

Этот код прекрасно работает во время выполнения, когда я обращаюсь к определенной странице много раз.(GetMygrid.asmx / js) Я не получаю 304 ответа при доступе к странице и получении следующего заголовка кэша.

Cache-Control: public

Истекает: понедельник, 27 февраля2012 04:52:11 GMT

Дата последнего изменения: Ср, 22 февраля 2012 04:52:11 GMT

Сервер: Microsoft-IIS / 7.5

Но моя проблема в том, что когда я в следующий раз войду в приложение (закрою браузер, а затем войду в систему), срок действия этого кэша истечет, а значение изменится на год назад. Я использую метод GET для этого вызова.

Cache-Control: private

Content-Type: application / x-javascript;charset = utf-8

Кодировка содержимого: gzip

Срок действия истекает: Пн, 21 фев 2011 15:35:48 GMT

Дата последнего изменения: Ср, 22 фев 201204:39:37 GMT

В приложении нет кода для сброса кэша год назад при входе в систему.

Не понимаю, почему это происходит.

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 01 марта 2012

У меня та же проблема, что и у вас, и я выдвинул теорию;)

Из того, что я могу сказать, когда JS запрашивается "первым" (в сеансе, хотя, возможно, и время жизни приложения)) модуль скрипта устанавливает заголовок «Expire» для фрагмента содержимого.Что вы, возможно, не замечаете, так это то, что ваш вызов SetExpires молча игнорируется в этом первом случае ... внутренняя часть этого метода [недокументированное, я мог бы добавить] только позволяет вам установить заголовок expires If и Only Ifновая дата истечения срока раньше, чем установленная в настоящее время ... поскольку «сейчас + 5 дней» не ранее, чем год назад, она фактически не устанавливается!

Все остальные вызовы (я думаю) в порядке после этого первого, так как любой модуль, предоставляющий прокси-серверы сценариев, не устанавливает срок действия снова на 304-х, поэтому ваш вызов SetExpires считается «ОК».

Что я не понимаю, так это то, что вызывает повторный вызов '.asmx / js', когда в браузере все еще должна быть кэшированная копия с будущим локальным сроком действия :(

Досадно, что класс HttpCachePOlicy запечатан, поэтому я не могу обойти его :( (Установка первого модуля не будет работать, так как SetExpires будет успешным для модуля сценария, который вызывается после вашего)

Я должен добавитьчто такое поведение имеет «смысл», так как это означает, что прокси-серверы скриптов никогда не будут устаревшими, поскольку они всегда будут повторно запрашиваться ... к сожалению, для нас 304 стали довольно дорогостоящими, и я могу житьпоскольку он устарел, так что хотелось бы некоторого контроля над этим поведением ...;)

...