从C#客户端调用OData操作并解析响应

时间:2013-07-17 07:34:56

标签: c# asp.net-web-api odata

我正在使用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数据服务已为我制作的类型化Movie对象?我有一种感觉,它可以在LinqPad中使用DataContractJsonSerializer类,但到目前为止还没有取得多大成功。

此外,我是否可以使用T4模板等来帮助以类型安全的方式支持这些动作调用,也许作为扩展我的客户端实体代码的部分类中的方法?

1 个答案:

答案 0 :(得分:1)

目前我们称之为WCF DS客户端中的“物化器”并不是真正公开的,所以我认为没有一种简单的方法可以从你拥有的有效载荷开始 - >用ODatalib解析 - >具体化为生成的第一类对象。

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

有关从WCF DS调用操作的信息,请参阅this article