2013-07-25 3 views
1

У меня есть служба WCF, размещенная в IIS. Размер ответов довольно большой, поэтому мне требуется динамическое сжатие данных, которое включено на стороне IIS (служба использует wsHttpBinding).Кэширование сжатых данных из WCF в IIS

В какой-то момент я понимаю, что мне нужно кэшировать сжатые данные. Каждый из запросов на сервер уникален, но возвращает только одно из нескольких возможных значений. Это означает, что я не могу использовать кеширование IIS, потому что каждый запрос отличается. С другой стороны, я не могу использовать кэширование WCF, потому что он ничего не знает о сжатии IIS, поэтому мы должны повторно сжимать кешированные данные снова и снова.

Есть ли способ работать с кешем данных IIS с кодом WCF/.net? Любые другие известные решения?

+0

В одном из моих предыдущих проектов, мы использовали кэширование Windows Azure для данных, возвращаемых из WCF. – lloydom

ответ

1

Прочтите статью: http://www.codeproject.com/Articles/53718/Extending-WCF-Part-II. Надеюсь, это поможет вам.

+0

Спасибо, в идеале, мне не нужно будет изменять привязки на стороне клиента (так как мое программное обеспечение уже установлено на нескольких тысячах рабочих станций и модифицирует файлы конфигурации, было бы ... раздражать). – Rory

+0

Проверьте мой ответ, это должно требовать нулевого изменения клиента, плюс оно должно быть намного более эффективным, чем этот ответ. Бит более вовлечен в его кодирование.Пинг меня, если вам нужна помощь в написании его;) – Aron

0

Вы можете создать свой собственный кэш. Создайте статическое поле только для чтения, ссылающееся на словарь. Защитите словарь с помощью блокировок. Храните в словаре сопоставление от значения запроса (значение в запросе, определяющем результат), к кешу id, где идентификатор кэша является именем файла или другим идентификатором для поиска файла. Или, если в памяти, фактический кешированный объект или blob. Все кэшированные файлы или капли будут сжаты, так что вам не нужно это делать.

Вы не можете использовать сжатие IIS в этом случае.

+0

Не согласен с тем, что я не могу использовать сжатие IIS. См. Мой ответ. – Aron

2

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

Напишите поведение службы, которое обнаруживает, что вы находитесь на HTTP. Затем, как только вы определяете, какой из больших объектов вы «возвращаете», вы перехватываете обратный вызов и заменяете его HttpContext.Response.Redirect().

Затем напишите отдельную услугу, чтобы разместить результаты ACTUAL как HTTP GET с детерминированным URL.

Преимущества, которые вы получите.

  1. можно кэшировать с помощью IIS снова (потенциально быстрее реализация кэширования)
  2. Reverse Proxy Caching работает хорошо
  3. кэша прокси провайдера вашего клиента работает слишком
  4. кэширование OS/браузер вашего клиента работает хорошо
  5. Heck, прокси мог даже делать декомпрессию для клиентов, которые не поддерживают GZIP

узор describ ed здесь перенаправляется HTTP к каноническому URL.

Образцы!

PS Попробуйте использовать 303 redirect if possible

Смежные вопросы