如何让WCF Dataservice停止跟踪实体更改?

par*_*rsh 8 wcf-data-services odata tridion tridion-content-delivery

我有一个web应用程序DataServiceContext通过代理调用OData Webservice().问题是代码,即使每次都调用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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我们不得不重置apppool以查看最新的数据更改.

所以在调试时,我注意到了

var context = (System.Data.Services.Client.DataServiceContext)cdService;
context.Entities[0].State = Unchanged
Run Code Online (Sandbox Code Playgroud)

所以我尝试通过.Detach()在返回值之前显式调用来修复它getPageContentForUrl,所以像,

cdService.Detach(page);
cdService.Detach(page.PageContent);
Run Code Online (Sandbox Code Playgroud)

我的问题是,我是否可以在更"全局"的水平上执行上述操作,也许Web服务总是将状态视为"已更改",因为我不想手动编写代码Detach()

Qui*_*ijn 9

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

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

对我来说,这听起来就像你描述的行为.幸运的是,可以通过在DataServiceContext上设置MergeOption属性来关闭缓存.

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

  • 是的,修复了这个问题,我不得不设置MergeOption = NoTracking,因为OData WS只是准备好了. (3认同)

Fra*_*len 5

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

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

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

<ObjectCache Enable="false" />
Run Code Online (Sandbox Code Playgroud)

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

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

为此,我建议联系SDL专业服务或SDL的合作伙伴之一.虽然配置对象缓存并不太困难,但在Q&A格式中解释它有点过于复杂.