2010-01-22 2 views
1

Я принимаю мое приложение WCF с помощью IIS. Чтобы обслуживать некоторые методы, мне нужна ссылка на вспомогательный объект, который сильно инициализирован. Хорошим сценарием является его инициализация один раз и помещение в кеш, тогда все запросы просто используют объект из кеша. Как я могу сделать кеширование?Общий кэш для служб wcf, запущенных в разных сервисахhosts

Самый простой способ - использовать статическое поле mywebmethod. IIS создает несколько ServiceHosts для обслуживания запросов. И в каждом сервисеhost статические поля будут разными.

Я старался использовать System.Web.HttpRuntime.Cache. Опять же, у меня есть некоторые независимые кеши.

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

Так что же может быть решением?

+0

Я обнаружил, что настоящая проблема с IIS не в разных сервисах. Они могут успешно совместно использовать объект System.Web.Caching.Cache, доступный через свойство HttpContext.Cache (подходящий, по крайней мере, для httpBindings). .Net создает один объект Cache для AppDomain. Если IIS использует несколько рабочих процессов в AppPool (по умолчанию в IIS 7, 10), он, очевидно, создает 100 AppDomains - и 10 отдельных кешей. – flashnik

ответ

1

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

Я могу думать только об одном способе достижения этой цели с помощью IIS: реализовать ServiceHostFactory, который вернет пользовательский ServiceHost, который запустит и остановит несколько ServiceHosts под капотом. Но это слишком хаки, чтобы быть фрагментом кода производства)

Обновление Я наткнулся на это сегодня, и этот ответ выглядит полным беспорядком. Различные хосты службы совместно используют один AppDomain, если они находятся на одном и том же сайте IIS, поэтому статические поля должны быть одинаковыми для всех служб.

+0

Выполняет ли запуск нескольких сервисов, обеспечивающих производительность? – flashnik

+0

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

+0

Одна вещь, которая мешает мне запускать самостоятельное размещение в потенциальной потере производительности по сравнению с несколькими servicehosta в IIS из-за только одного servicehost. – flashnik

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