我已经进行了广泛的搜索,并且完全无法找到任何有关如何使用ODataLib调用服务操作的好示例或教程。我已经看到几个告诉我如何获取实体和实体集,这很好,但为了调用服务操作。
我几乎肯定我需要使用ODataEntry
,ODataFeed
或ODataNavigationLink
对象之外的其他内容。我在JustDecompile中打开了库,看到了像ODataAction
和ODataFunction
这样的类,但无法弄清楚如何使用它们。
我的需求非常简单:我需要调用WCF Data Services 5.0服务操作,我需要使用JSON。
我也知道即将发布的WCF数据服务客户端库将支持JSON但不幸的是我必须像昨天一样编写代码。此外,出于绝望,我甚至尝试使用Mark Stafford's JSON light sample实现RC版本( gasp ),但并不真正理解它是如何工作的。
任何帮助或方向都会非常感激! (特别是如果这出现在你的屏幕上,马克!)
谢谢! Ĵ
答案 0 :(得分:2)
ODataLib不知道(并且不应该知道)它正在读取服务操作的响应。唯一重要的是你要阅读的有效负载类型。
这取决于服务操作返回的内容。如果它返回单个条目,则使用ODataLib就像读取单个条目有效负载(例如〜/ Products(0)),因为有线格式将是相同的。如果服务操作返回实体集合,则将其读取为feed。
如果服务操作返回单个基元或复数值,则可以使用ODataMessageReader.ReadProperty。我知道该方法的名称有点误导,但这又是因为属性有效负载(如〜/ Products(0)/ Name)和返回原语或复杂类型的服务操作使用完全相同的有效负载格式。在这种情况下,您应该忽略返回的属性的名称(它可能是服务操作的名称)。
如果服务操作返回原始值或复杂值的集合,则可以使用ODataMessageReader.CreateODataCollectionReader。这将返回ODataCollectionReader阅读器,您以与ODataReader非常相似的方式使用它。它报告的有趣内容是相关集合的项目(在这种情况下,API很容易理解)。
您是否需要阅读ATOM或JSON无关紧要,这取决于您,API是相同的。
答案 1 :(得分:2)
ODataLib和WCF数据服务(依赖于ODataLib)之间的选择通常归结为对控制的需求。如果您的用例很简单并且您需要最常用的功能,那么WCF DS可能非常适合。如果您需要高级功能或精确控制有效负载的读取方式,ODataLib可能是更好的匹配。尽管如此,Vitek已经概念性地介绍了如何使用ODataLib读取服务操作。
WCF DS将在5.1版中更轻松地阅读JSON Light。我将在本周的某个时候发表关于此的博客,但您引用的示例是您需要为此RC做的事情。在我放在一起的示例中只有一个新的调用 - 对context.Format.UseJson(Func<Uri,ModelResolverResult>)
的调用。我们先谈谈为什么这个电话是必要的。 OData(至少在微软世界中)打字很好。 $metadata
是OData描述其正在使用的数据模型的一个很好的例子。使用Atom payload或甚至JSON Verbose有效负载,大部分类型信息都在有效负载中传输。使用JSON Light,目标是尽可能多地从“传输”有效负载中删除元数据。
如果元数据在带内不可用,则必须在带外提供。这是对UseJson
的调用签名背后的基本要求。实质上,每当WCF DS需要元数据时,它将查找给定URI的模型。如果找不到该模型,它最终会将元数据拨号为完整。我们想要抢先一步,因为它会使有效载荷膨胀。我们可以通过告诉WCF DS如何提前解决模型来抢占它。这就是大部分样本正在做的事情。
逻辑地遍历样本(是的,我知道可以进行其他一些优化 - 样本主要是为了可读性而优化):
XmlReader
EdmxReader.TryParse
EdmxReader.TryParse
EdmxReader.TryParse
ModelResolverResult
包装器希望这是有道理的。如果没有,我很想知道为什么我可以让博客更清楚。请记住,当我们将这些位发布到生产时,这将变得更加简单。