что мой запрос не включает if-non-match в заголовок

Я использую пакет NUGET https://github.com/filipw/AspNetWebApi-OutputCache для управления кешированием для моего веб-API ASP.NET.

Кеширование на стороне сервера работает хорошо. Однако я не вижу, чтобы он работал в моем браузере (на стороне клиента).

По запросу я вижу, что возвращаются max-age и etag.

Однако я делаю дополнительный запрос. Я не вижу, чтобы etag был предоставлен с заголовком запроса с параметром if-non-match. Вот почему я получаю ответ 200 (ОК) с данными ответа. Он должен был проанализировать данные из самого кеша.

https://dl.dropboxusercontent.com/u/2781659/stackoverflow/Cache.jpg

Кто-нибудь может посоветовать?


person Paresh Varde    schedule 11.10.2013    source источник
comment
Я провел дополнительное тестирование и обнаружил, что когда я нажимаю такой запрос, как localhost / breeze / lfLookups if-none-match включается по запросу, и я получаю 304 ответ без данных. Я этого и ожидал. Однако я использую Breeze.js, который фактически вызывает эти API-вызовы и создает URL-адрес как localhost / breeze / lfLookups ? _ = 1381488654430 динамическое добавление параметра строки запроса. AspNetWebApi-OutputCache имеет возможность исключить параметр строки запроса, который я уже установил. Не уверен, что здесь не так.   -  person Paresh Varde    schedule 11.10.2013
comment
Есть ли способ в breeze.js, чтобы я мог указать конкретному запросу не включать параметр querystring в мои запросы GET? бывший. localhost / breeze / lfLookups? _ = 1381488654430 должен быть просто localhost / breeze / lfLookups, потому что контекст для этого запроса кэшируется. Если я смогу это сделать, моя проблема должна быть решена.   -  person Paresh Varde    schedule 11.10.2013
comment
Вы уверены, что проблема в строке запроса? Можете ли вы проверить, скопировав и вставив запрос в URL-адрес браузера?   -  person PW Kad    schedule 11.10.2013
comment
URL правильный. Проблема, которую я вижу, заключается в том, что при изменении параметров строки запроса заголовок запроса не содержит части If-None-Match: VALUE, что вызывает загрузку свежих данных.   -  person Paresh Varde    schedule 11.10.2013
comment
Я понимаю, в чем проблема. jQUery обрабатывает заголовок if-none-match, но доступен только в текущем сеансе. Я пытался кэшировать json, полученный через вызов jQuery ajax. Мне пока не удалось найти никакого решения. Просто обновление.   -  person Paresh Varde    schedule 14.10.2013


Ответы (1)


Я только что вкратце посмотрел на проект Github, на который вы ссылались, и хотел вложить свои 0,02 доллара, чего бы он ни стоил -

Breeze.js отвечает за кеширование на стороне клиента. Идея состоит в том, чтобы не беспокоиться о том, что делает серверная часть, а просто принять логическое решение на клиенте о том, следует ли продолжить и снова обратиться к серверу за данными. Если вам не нужно обновлять данные, никогда не попадайте на сервер, просто вернитесь из кеша Breeze.

Проект, на который вы ссылаетесь, похоже, выполняет как кеширование на стороне сервера, так и на стороне клиента. Решение о кешировании на сервере - это нелегко, но этот проект, похоже, справляется с этим довольно хорошо.

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

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

В целом этот проект, похоже, игнорирует параметры queryString, насколько я могу судить, для поддержки JSONP, поэтому у вас не должно возникнуть проблем с разработкой собственного решения, если вы все еще считаете, что это необходимо.

person PW Kad    schedule 11.10.2013
comment
У меня есть огромные данные, которые загружаются в начальное одностраничное приложение. Эти данные могут быть изменены на сервере, но это очень редко. Кэширование на стороне сервера предназначено для новых пользователей, запрашивающих данные, и я не хочу попадать в базу данных. Кеш на стороне клиента поможет использовать для загрузки страницы намного быстрее, когда я ее кэширую. Причина, по которой я не хочу использовать механизм кэширования Breeze, заключается в том, что я хочу сделать недействительным уровень HTTP кеша с помощью eTags - person Paresh Varde; 11.10.2013