InstanceContextMode.Single в WCF wsHttpBinding, webHttpBinding и REST

Недавно я начал разработку относительно простой службы WCF REST, которая возвращает результаты в формате JSON. Сначала все работало отлично, и сервис быстро заработал.

Основная функция сервиса — вернуть большой кусок данных, извлеченных из базы данных. Эти данные редко меняются, поэтому я решил попробовать настроить механизм кэширования, чтобы ускорить процесс. Для этого я планировал установить InstanceContextMode.Single и ConcurrencyMode.Multiple, а затем с некоторыми блокировками потока безопасно возвращать статический кешированный результат. Примерно каждые 5 минут или всякий раз, когда IIS решает все очистить, данные будут повторно извлекаться из базы данных.

Моя проблема заключается в том, что InstanceContextMode.Single ведет себя не так, как ожидалось. Насколько я понимаю, следует создать и поддерживать один экземпляр моего класса обслуживания WCF. Однако поведение, которое у меня есть, - это совершенно новый экземпляр моего класса, созданный для каждого вызова. Это включает повторную инициализацию всех статических переменных.

Я попытался изменить веб-службу с webHttpBinding (используемой для REST) ​​на wsHttpBinding и использовать службу в качестве конфигурации SOAP, но это приводит к точно такому же поведению.

Что я делаю неправильно!!! Слишком долго пытался это понять.

Любая помощь будет здорово!.


person Chris    schedule 12.10.2012    source источник
comment
Не могли бы вы опубликовать определение и конфигурацию службы?   -  person Adam S    schedule 01.12.2012


Ответы (1)


Странно, можешь попробовать и сказать, что тогда будет?

ServiceThrottlingBehavior ThrottleBehavior = new ServiceThrottlingBehavior();
ThrottleBehavior.MaxConcurrentSessions = 1;
ThrottleBehavior.MaxConcurrentCalls = 1;
ThrottleBehavior.MaxConcurrentInstances = 1;

ServiceHost Host = ...
Host.Description.Behaviors.Add(ThrottleBehavior);

И [откуда] вы знаете, что ваш единственный экземпляр службы не является «одиночным»? Вы видели несколько подключений к базе данных из профилировщика? Это то, что подсказало вам, почему ваш сервис не является единственным экземпляром? Выполняете ли вы какую-то часть работы в отдельном потоке из реализации операции службы?

person Community    schedule 24.12.2013