0

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

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

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

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

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

谢谢!Ĵ

4

2 回答 2

2

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

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

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

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

无论您需要阅读ATOM还是JSON,这都取决于您,API是相同的。

于 2012-07-15T17:59:23.150 回答
2

作为客户端,在 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 有效负载甚至 JSON Verbose 有效负载,大部分类型信息都包含在有效负载中。使用 JSON Light 的目标是尽可能多地从“传输”有效负载中去除元数据。

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

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

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

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

于 2012-07-16T15:22:24.507 回答