Ответ с 304 - Кэширование на стороне клиента с использованием ASP.NET Webservices

Я разрабатываю свое приложение в ASP.NET 4.5. Я настраиваю веб-сервис. Jquery получает доступ к веб-сервису с помощью вызова GET Ajax. Функция имеет параметр 'id' и для каждого идентификатора возвращает различное содержимое.

Я хочу кешировать эти данные как на сервере, так и на клиенте. На клиенте я уже знаю, как использовать "CacheDuration", но проблема со стороны клиента. Я использую HttpFox, чтобы получить заголовки каждого ответа.

Я установил следующий код в начале функции:

    HttpCachePolicy cache = HttpContext.Current.Response.Cache;
    cache.SetCacheability(HttpCacheability.Private);
    cache.SetExpires(DateTime.Now.AddMinutes((double)10));
    cache.SetMaxAge(new TimeSpan(0, 0, 10));


    FieldInfo maxAgeField = cache.GetType().GetField(
    "_maxAge", BindingFlags.Instance | BindingFlags.NonPublic);
    maxAgeField.SetValue(cache, new TimeSpan(0, 10, 0));

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

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

Я знаю, что это можно сделать с помощью кода, поэтому, пожалуйста, не отправляйте решения IIS.

Нужна ваша помощь, чтобы решить это.

1 ответ

Решение

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

Response.Cache.SetLastModified(lastWriteTime.Value.ToUniversalTime());

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

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

public static DateTime Round10(this DateTime value)
{   
    var ticksIn10Mins = TimeSpan.FromMinutes(10).Ticks;

    DateTime dtReturn = (value.Ticks % ticksIn10Mins == 0) ? value : new DateTime((value.Ticks / ticksIn15Mins + 1) * ticksIn10Mins);
    if(dtReturn > DateTime.Now())
    {
        return dtReturn.AddMinutes(-10); 
    } else {
        return dtReturn;
    }
}


Response.Cache.SetLastModified(Round10(DateTime.Now);

Этот код не проверен, хотя

Другие вопросы по тегам