Как заставить 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.

См. http://msdn.microsoft.com/en-us/library/gg602811.aspx.

Как уже прокомментировал Quirijn, похоже, что служба OData для доставки контента Tridion возвращает кэшированные результаты в вашей настройке. Отсоединение и повторное подключение клиента - это обходной путь грубой силы.

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

Самый простой шаг - найти файл cd_storage_conf.xml вашего веб-приложения cd_webservice и отключить кэширование объектов (как уже сказал Куирин):

<ObjectCache Enable="false" />

Теперь перезапустите пул приложений, как вы делали раньше, и повторите тестирование. Если вызовы OData теперь всегда возвращают обновленное содержимое, ваша проблема действительно была вызвана неправильно настроенным объектным кешем.

К сожалению, на этом этапе все, что вам нужно сделать, - это отключить кэш объектов, что, несомненно, уменьшит нагрузку, которую может выдержать ваш веб-сервис. Следующим шагом должно стать исправление проблемы конфигурации вашего Object Cache.

Для этого я бы предложил обратиться в SDL Professional Service или к одному из партнеров SDL. Хотя настройка Object Cache не слишком сложна, она слишком сложна для объяснения в формате вопросов и ответов.

Другие вопросы по тегам