Внедрение кэширования данных и других эффектов в конвейер WCF - PullRequest
1 голос
/ 26 февраля 2011

У меня есть служба, которая всегда возвращает одинаковые результаты для данного параметра. Естественно, я хотел бы кэшировать эти результаты на клиенте

Есть ли способ ввести кеширование и другие эффекты внутри конвейера WCF? Возможно, пользовательский класс привязки может размещаться между клиентом и фактической привязкой HTTP.

EDIT:

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2011

Служба WCF может использовать в заголовке HTTP директивы Cache-Control , чтобы сообщить клиенту как , что она должна использовать кэш на стороне клиента. Есть много опций, которые являются частью протокола HTTP . Таким образом, вы можете, например, определить, как долго клиент может просто получать данные из локального кэша, а не отправлять запросы на сервер. Все клиенты, использующие HTTP, как и все веб-браузеры, будут следовать инструкциям. Если ваш клиент использует ajax запросы к серверу WCF, то соответствующий вызов ajax просто возвращает данные из локального кэша.

Кроме того, можно реализовать много интересных сценариев кэширования. Например, если для параметра «Cache-Control» установлено значение «max-age = 0» (см. здесь пример), то клиент всегда будет выполнять повторную проверку кэша сервером , Обычно сервер отправляет в заголовок так называемый «ETag» вместе с данными. «ETag» представляет хеш MD5 или любую другую свободную информацию, которая будет изменена при изменении данных. Клиент автоматически отправляет "ETag", полученный ранее с сервера, вместе в заголовке запроса GET на сервер. Сервер может ответить специальным ответом HTTP/1.1 304 Not Modified (вместо типичного ответа HTTP/1.1 200 OK) и , когда тело не имеет данных . В случае, если клиент будет безопасно получать данные из локального кэша.

Я использую «Cache-Control: max-age = 0» дополнительно с Cache-Control: private, который отключает кэширование данных на прокси-сервере и объявляет, что данные могут кэшироваться, но не передаваться другим пользователям.

Если вы хотите узнать больше об управлении кэшированием в отношении заголовков HTTP, я рекомендую вам прочитать следующее Руководство по кэшированию .

ОБНОВЛЕНО : Если вы хотите реализовать какое-либо общее кэширование, вы можете использовать Microsoft Enterprise Library , которая содержит Блок кэширования приложения . Библиотека Microsoft Enterprise публикуется в CodePlex с исходным кодом . В качестве альтернативы .NET 4.0 вы можете использовать System.Runtime.Caching . Его можно использовать не только в ASP.NET (см. здесь )

Я продолжаю рекомендовать вам использовать HTTP-привязку с HTTP-кэшированием, если это возможно только в вашей среде. Таким образом, вы можете сэкономить много времени на разработку и получить в конце более простое, масштабируемое и эффективное приложение. Поскольку HTTP так важен, в нем реализовано уже так много полезных вещей, которые вы можете использовать «из коробки». Кэширование - только одна из возможностей.

0 голосов
/ 27 февраля 2011

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

Edit:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...