【问题标题】:Using ODataLib to call a WCF Data Services service operation and JSON使用 ODataLib 调用 WCF 数据服务服务操作和 JSON
【发布时间】:2012-07-13 19:33:46
【问题描述】:

我进行了广泛的搜索,但完全找不到任何关于如何使用 ODataLib 调用服务操作的好的示例或教程。我见过几个告诉我如何获取实体和实体集的东西,这很好,但是为了调用服务操作。

我几乎可以肯定我需要使用 ODataEntryODataFeedODataNavigationLink 对象以外的东西。我在 JustDecompile 中打开了库,看到了 ODataActionODataFunction 这样的类,但不知道如何使用它们。

我的需求很简单:我需要调用 WCF Data Services 5.0 服务操作,并且需要使用 JSON 来完成。

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

任何帮助或指导将不胜感激! (特别是如果这出现在你的屏幕上,马克!)

谢谢! J

【问题讨论】:

    标签: json wcf wcf-data-services odata


    【解决方案1】:

    作为客户端在 ODataLib 和 WCF 数据服务(取决于 ODataLib)之间进行选择通常归结为对控制的需要。如果您的用例很简单并且您需要最常用的功能,那么 WCF DS 可能是一个不错的选择。如果您需要高级功能或精确控制有效负载的读取方式,ODataLib 可能是更好的选择。话虽如此,Vitek 已经从概念上介绍了如何使用 ODataLib 读取服务操作。

    WCF DS 将在 5.1 版中使读取 JSON Light 变得更加容易。我将在本周的某个时候发布关于此的博客,但您引用的示例是您需要为此 RC 做的。在我放在一起的示例中只有一个新呼叫 - 对 context.Format.UseJson(Func<Uri,ModelResolverResult>) 的呼叫。让我们先谈谈为什么这个调用是必要的。 OData(至少在 Microsoft 世界中)非常适合强类型。 $metadata 是一个很好的 OData 示例,它描述了它正在使用的数据模型。对于Atom payload 甚至是 JSON Verbose 有效负载,大部分类型信息都包含在有效负载中。使用 JSON Light 的目标是尽可能多地从“传输”负载中剥离元数据。

    如果元数据在带内不可用,则必须在带外提供。这是对UseJson 的调用签名背后的基本要求。本质上,每当 WCF DS 需要元数据时,它都会查找给定 URI 的模型。如果它找不到那个模型,它最终会将元数据拨到满。我们想抢占它,因为它会使有效负载膨胀。我们可以通过提前告诉 WCF DS 如何解析模型来抢占它。这就是大多数样本正在做的事情。

    逻辑地浏览示例(是的,我知道可以进行许多其他优化 - 示例主要针对可读性进行了优化):

    • 如果过去没有解决模型
      • 构造一个新的XmlReader 以调用EdmxReader.TryParse
      • EdmxReader.TryParse 中的输出参数命名一些值
      • 调用EdmxReader.TryParse
        • 如果调用成功,将解析后的模型缓存在本地字典中(解析现在是一项昂贵的操作)
        • 如果调用失败,将错误放在一起并抛出
    • 从缓存模型中获取正确的模型并将其返回到 ModelResolverResult 包装器中

    希望这是有道理的。如果没有,我很想听听为什么,这样我才能使博客文章更清晰。请记住,当我们将这些位发布到生产环境时,这将变得更加简单。

    【讨论】:

    • 您所说的非常有道理,实际上完全阐明了示例的含义。像往常一样,你已经设法把它降到我的水平,我非常感谢你!
    【解决方案2】:

    ODataLib 不知道(也不应该知道)它正在读取服务操作的响应。唯一重要的是您要读取哪种有效负载。

    这取决于服务操作返回什么。如果它返回单个条目,则使用 ODataLib 就像读取单个条目有效负载(例如 ~/Products(0)),因为有线格式将是相同的。如果服务操作返回一个实体集合,则像提要一样读取它。

    如果服务操作返回单个原始值或复杂值,您可以使用 ODataMessageReader.ReadProperty。我知道该方法的名称有点误导,但这又是因为属性有效负载(如 ~/Products(0)/Name)和返回原始或复杂类型的服务操作使用完全相同的有效负载格式。在这种情况下,您应该忽略返回的属性名称(它可能是服务操作的名称)。

    如果服务操作返回原始值或复杂值的集合,您可以使用 ODataMessageReader.CreateODataCollectionReader。这将返回 ODataCollectionReader 阅读器,您以与 ODataReader 非常相似的方式使用它。它报告的有趣的东西是相关集合的项目(在这种情况下,API 很容易理解)。

    读ATOM还是JSON都无所谓,API都是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多