使用ODataLib调用WCF数据服务服务操作和JSON

时间:2012-07-13 19:33:47

标签: json wcf wcf-data-services odata

我已经进行了广泛的搜索,并且完全无法找到任何有关如何使用ODataLib调用服务操作的好示例或教程。我已经看到几个告诉我如何获取实体和实体集,这很好,但为了调用服务操作。

我几乎肯定我需要使用ODataEntryODataFeedODataNavigationLink对象之外的其他内容。我在JustDecompile中打开了库,看到了像ODataActionODataFunction这样的类,但无法弄清楚如何使用它们。

我的需求非常简单:我需要调用WCF Data Services 5.0服务操作,我需要使用JSON。

我也知道即将发布的WCF数据服务客户端库将支持JSON但不幸的是我必须像昨天一样编写代码。此外,出于绝望,我甚至尝试使用Mark Stafford's JSON light sample实现RC版本( gasp ),但并不真正理解它是如何工作的。

任何帮助或方向都会非常感激! (特别是如果这出现在你的屏幕上,马克!)

谢谢! Ĵ

2 个答案:

答案 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
    • 中为out参数命名一些值
    • 调用EdmxReader.TryParse
      • 如果调用成功,请将解析后的模型缓存在本地字典中(解析现在是一项昂贵的操作)
      • 如果通话失败,请将错误放在一起并抛出
  • 从缓存的模型中获取正确的模型,并将其返回到ModelResolverResult包装器

希望这是有道理的。如果没有,我很想知道为什么我可以让博客更清楚。请记住,当我们将这些位发布到生产时,这将变得更加简单。