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()?
我认为答案确实存在 - 正如您所怀疑的 - 在您正在使用的代理中,或者更确切地说在DataServiceContext中.这就是微软所说的:
默认情况下,客户端仅将响应提要中的条目实现为对象,以用于尚未由DataServiceContext跟踪的实体.这意味着不会覆盖对缓存中已有对象的更改.通过为查询和加载操作指定MergeOption值来控制此行为.
对我来说,这听起来就像你描述的行为.幸运的是,可以通过在DataServiceContext上设置MergeOption属性来关闭缓存.
请参阅http://msdn.microsoft.com/en-us/library/gg602811.aspx.
正如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格式中解释它有点过于复杂.
| 归档时间: |
|
| 查看次数: |
3538 次 |
| 最近记录: |