9

我有DataServiceContext一个通过代理调用 OData Webservice () 的 Web 应用程序。问题是代码,即使每次调用 OData webservice,它总是在内容管理系统 (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);

我的问题是,我可以在更“全局”的级别上执行上述操作吗,也许 Web 服务总是假设状态为“已更改”,因为我不想手动编写代码Detach()

4

2 回答 2

10

我认为答案确实在于 - 正如您所怀疑的 - 在您正在使用的代理中,或者更确切地说在 DataServiceContext 中。这是微软不得不说的:

默认情况下,客户端仅将响应提要中的条目具体化为尚未被 DataServiceContext 跟踪的实体的对象。这意味着对已在缓存中的对象所做的更改不会被覆盖。此行为是通过为查询和加载操作指定 MergeOption 值来控制的。

对我来说,这听起来与您所描述的行为完全一样。幸运的是,可以通过在 DataServiceContext 上设置 MergeOption 属性来关闭缓存。

请参阅http://msdn.microsoft.com/en-us/library/gg602811.aspx

于 2012-11-09T10:57:07.057 回答
5

正如 Quirijn 已经评论的那样,Tridion Content Delivery OData 服务似乎在您的设置中返回缓存的结果。分离和重新连接客户端是一种蛮力解决方法。

Tridion 内容交付对象缓存将(正确配置时)在内容管理系统的发布操作更新项目时自动从其缓存中删除项目。由于您的设置中没有发生这种情况,因此您的对象缓存似乎没有正确配置。

最简单的步骤是找到 cd_webservice Web 应用程序的 cd_storage_conf.xml 文件并关闭对象缓存(正如 Quirijn 已经说过的):

<ObjectCache Enable="false" />

现在像以前一样回收应用程序池并再次测试。如果现在 OData 调用总是返回更新的内容,那么您的问题确实是由错误配置的对象缓存引起的。

不幸的是,在这个阶段,您所要做的就是关闭对象缓存,这肯定会减少您的 Web 服务可以处理的负载。下一步应该是修复对象缓存的配置问题。

为此,我建议联系 SDL 专业服务或 SDL 的合作伙伴之一。虽然配置对象缓存并不太难,但是以问答的形式解释起来有点太复杂了。

于 2012-11-08T18:51:29.077 回答