我有一个 Web 应用程序,它通过代理调用 OData Webservice ( DataServiceContext
)。问题是代码即使每次都调用 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()
?
最佳答案
我认为答案确实在于 - 正如您所怀疑的 - 在您正在使用的代理中,或者更确切地说在 DataServiceContext 中。这是微软不得不说的:
By default, the client only materializes an entry in the response feed into an object for entities that are not already being tracked by the DataServiceContext. This means that changes to objects already in the cache are not overwritten. This behavior is controlled by specifying a MergeOption value for queries and load operations.
对我来说,这听起来与您所描述的行为完全一样。幸运的是,可以通过在 DataServiceContext 上设置 MergeOption 属性来关闭缓存。
见 http://msdn.microsoft.com/en-us/library/gg602811.aspx .
关于wcf-data-services - 如何使 WCF Dataservice 停止跟踪实体更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13286416/