1

我正在使用 VS2012 中的 ASP.Net WebAPI 预发布位编写服务器(我很高兴使用 VS2013,尽管目前我认为它没有帮助)。在其中,我有一堆 OData 控制器暴露了一些实体。我希望在这些实体上设置一些 OData 操作,就像 CodePlex 上可用的 ASP.Net 示例中的 ODataActionsSample 一样。

我的第一个客户端是基于 C# 的 WPF 应用程序。通过 WCF 数据服务查询很好。

我想做的是调用出现在 OData 元数据中的操作,然后解析它们的结果。

似乎本机操作调用在 WCF 数据服务客户端中不可用,因此我需要使用 HttpClient 自己进行。是对的吗?如果是这样,我已经在这条路上走了一段路。如果我想对实体调用操作,而不是对 URL 进行硬编码,我只需构建一个 LINQ 查询来获取该实体,例如(来自该 ODataActionSample)

Movies.Where(m=>m.Id == 1)

而不是调用它,我执行 .ToString() 来获取将被调用的 URL。然后我可以操纵该 URL 以添加参数和/或操作。

现在,假设可行,我会返回一些 JSON。对于 ODataActionSample,我可以通过 POST 到 URL http://localhost.fiddler:8708/odata/Movies(3)/CheckOut查看电影

这就像返回 JSON

{
  "odata.metadata":"http://localhost:8708/odata/%24metadata#Movies/@Element","#CheckOut":{

  },"ID":3,"Title":"Fatal Vengeance 2","Year":2012,"DueDate":"2013-07-24T16:33:14.0699789+10:00"
}

如何将其转回 WCF 数据服务已经为我制作的类型化电影对象?我觉得这是可能的,并且在 LinqPad 中使用了 DataContractJsonSerializer 类,但到目前为止还没有取得太大的成功。

另外,我是否可以使用 T4 模板或类似的东西来帮助以类型安全的方式搭建其中一些操作调用,也许作为扩展我的客户端实体代码的部分类中的方法?

4

1 回答 1

1

目前我们在 WCF DS 客户端中称为“物化器”的东西并不是真正公开的,所以我认为没有一种简单的方法可以从您拥有的有效负载 -> 使用 ODatalib 解析 -> 物化到第一类对象那是生成的。

相反,我会使用 DataServiceContext 上的 Execute(或 Begin/End Execute)方法来调用操作。是的,这意味着您将需要构建一个 URL,但这在大多数情况下应该不是什么大问题。

请参阅这篇关于从 WCF DS 调用操作的文章。

于 2013-07-23T05:37:36.260 回答