HttpClient文档混乱(JSON Rest webservice)

时间:2015-03-02 14:03:24

标签: asp.net json web-services

我试图理解描述相同内容的两篇文章中的差异的原因(调用JSON rest webservice)。

第1条:Calling a Web API From a .NET Client in ASP.NET Web API 2

第2条:Calling ASP.NET WebAPI using HttpClient

区别在于:

HttpResponseMessage response = await client.GetAsync("api/products/1");

vs

HttpResponseMessage response = client.GetAsync(url).Result;

Product product = await response.Content.ReadAsAsync>Product>();

vs

var users = response.Content.ReadAsAsync<Users>().Result;

我的困惑不在于调用的异步性质,我理解await语句的功能。我的困惑源于CodeProject示例末尾的.Result(BTW代码项目示例对我有用)以及Microsoft文章没有它们的事实。

如果我复制Microsoft文章代码,我会收到编译器警告,希望我在返回类型周围添加Task。我错过了什么?

由于

1 个答案:

答案 0 :(得分:1)

ABCAsync方法返回Task<something>以封装可能失败/已完成/挂起操作的状态。一旦操作完成,返回的值Result属性将包含实际的返回值。

通过编译器支持 - await关键字 - 编译器隐藏了这个细节。

因此使用await只能看到操作的结果(Task<T>实例被隐藏),但是当不使用编译器支持时,你必须处理细节。

NB。任务未完成时访问Task<T>.Result将阻止;如果它失败了那么它会抛出。因此

var x = obj.ABCAsync().Result;

非常类似于调用方法的阻止版本;但是有了编译器助手的额外开销。