【发布时间】:2011-03-23 02:03:29
【问题描述】:
我使用 OData 已经有一段时间了,我发现它是设置服务器的绝佳工具。今天我遇到了一些我以前从未见过的东西,这绝对让我感到困惑。
我在客户端上使用 .Expand 来请求获取报告时的数据树。我在原型中使用了确切的查询,它工作得很好(即完全水合)。当我使用 Fiddler 发送查询时,响应数据包是完美的,并且包含了我正在寻找的所有数据。
问题是客户端没有对任何扩展属性进行水合(服务引用完全与当前服务保持同步)。为了尝试弄清楚发生了什么,我已将范围缩小到单个属性,但它仍然无法正常工作。
var report = (serviceContext.Reports.Expand("ReportAreas").Where(r=>r.ReportID==reportID)).SingleOrDefault();
给我报告,但 ReportAreas 包含 0 个项目。如果我再尝试:
serviceContext.LoadProperty(report,"ReportAreas");
那么 ReportAreas 包含 20 个左右的项目。
这让我非常抓狂,因为 Expand 正在为不同的对象树(不同的查询但相同的功能代码)工作,根本没有任何问题。有没有人对我如何弄清楚这里到底发生了什么有什么建议???
更新:
今天关于这个的一些新信息可能更复杂,并向我暗示了 OData 客户端中的一个错误。我发现只有报告对象的一个子集返回而没有填充扩展属性。数据库中的大多数报告都非常好。即,如果我请求扩展 ReportAreas 的所有报告(而不是细化为单个 reportID),则大约 80-90% 的 ReportAreas 具有非零计数,其余为 0。
当报告返回时没有填充任何属性(null 或 0 计数),实际的属性对象正在被实例化,并且它们的属性正在被设置(从服务引用的 Reference.cs 文件中的断点开始)所以,对于例如,属于 ReportArea 对象的 ReportID、PropertyAreaID 和 History 值在查询解析期间设置了 16 次,但 ReportAreas 列表在请求时计数为 0。当我使用 _service.LoadProperty 时,它返回 16 个 ReportAreas。
在我看来,Expand 查询中的引用不匹配,但它过于一致,不是一个简单的问题。有效的报告总是有效,无效的报告永远无效。真的希望有人能帮我查明这一点,以便我可以继续进行一些有用的编码......
【问题讨论】:
-
你能试试 Fiddler 看看什么查询(URL)被发送到服务器,响应是否包含扩展数据。
-
根据第 2 段“当我使用 Fiddler 发送查询时,响应包是完美的(即包含所有扩展数据)”
-
我知道当您从 Fiddler 手动发送请求时,它可以工作。我在问你是否可以使用 Fiddler 查看客户端应用程序发送的请求,尤其是请求的 URL 和响应。
-
啊……现在没时间检查。明天早上我会第一件事。
-
好的,因为我怀疑请求和响应似乎是完美的。唯一没有发生的是对象作为对象图的一部分出现。我可以使用 service.Property( , ) 填充每个属性,但这需要大约 30 秒。
标签: odata