Как заставить WCF Dataservice перестать отслеживать изменения сущностей?
У меня есть веб-приложение, которое вызывает OData Webservice (DataServiceContext
) через прокси. Проблема заключается в коде, несмотря на то, что каждый раз он обращается к веб-службе OData, он всегда возвращает старые данные после изменения содержимого в системе управления контентом (SDL Tridion).
string getPageContentForUrl(string url)
{
var page = cdService
.Pages
.Expand("PageContent")
.Where(x => x.Url == url)
.FirstOrDefault();
if (page == null || page.PageContent == null)
{
return string.Empty;
}
else
{
return page.PageContent.Content;
}
}
Мы должны были сбросить пул приложений, чтобы увидеть последние изменения данных.
Так что во время отладки я заметил, что
var context = (System.Data.Services.Client.DataServiceContext)cdService;
context.Entities[0].State = Unchanged
поэтому я попытался исправить это, позвонив .Detach()
явно перед возвратом значения из getPageContentForUrl
так что-то вроде,
cdService.Detach(page);
cdService.Detach(page.PageContent);
Мой вопрос заключается в том, могу ли я сделать вышеупомянутое на более "глобальном" уровне, возможно, веб-сервис всегда принимает состояние "Изменено", поскольку я не хочу вручную писать код для Detach()
?
2 ответа
Я думаю, что ответ действительно - как вы и подозревали - в используемом вами прокси, точнее в DataServiceContext. Это то, что Microsoft должна сказать:
По умолчанию клиент материализует запись в фиде ответов в объект только для сущностей, которые еще не отслеживаются объектом DataServiceContext. Это означает, что изменения в объектах, уже находящихся в кэше, не перезаписываются. Это поведение контролируется указанием значения MergeOption для запросов и операций загрузки.
Для меня это звучит так же, как поведение, которое вы описываете. К счастью, кэширование можно отключить, установив свойство MergeOption в DataServiceContext.
Как уже прокомментировал Quirijn, похоже, что служба OData для доставки контента Tridion возвращает кэшированные результаты в вашей настройке. Отсоединение и повторное подключение клиента - это обходной путь грубой силы.
Кэш объектов доставки контента Tridion (при правильной настройке) автоматически удаляет элементы из своего кэша, когда они обновляются с помощью действий публикации из системы управления контентом. Поскольку этого не происходит в вашей настройке, похоже, что ваш объектный кэш настроен неправильно.
Самый простой шаг - найти файл cd_storage_conf.xml вашего веб-приложения cd_webservice и отключить кэширование объектов (как уже сказал Куирин):
<ObjectCache Enable="false" />
Теперь перезапустите пул приложений, как вы делали раньше, и повторите тестирование. Если вызовы OData теперь всегда возвращают обновленное содержимое, ваша проблема действительно была вызвана неправильно настроенным объектным кешем.
К сожалению, на этом этапе все, что вам нужно сделать, - это отключить кэш объектов, что, несомненно, уменьшит нагрузку, которую может выдержать ваш веб-сервис. Следующим шагом должно стать исправление проблемы конфигурации вашего Object Cache.
Для этого я бы предложил обратиться в SDL Professional Service или к одному из партнеров SDL. Хотя настройка Object Cache не слишком сложна, она слишком сложна для объяснения в формате вопросов и ответов.