Ответ с 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);
Этот код не проверен, хотя