如何使用 HttpContentExtensions.ReadAsAsync<T>()?

Posted

技术标签:

【中文标题】如何使用 HttpContentExtensions.ReadAsAsync<T>()?【英文标题】:How can I use HttpContentExtensions.ReadAsAsync<T>()? 【发布时间】:2014-06-15 06:32:49 【问题描述】:

我正在尝试在 VS2013 (.net 4.5.1) 中通过 tutorial explaining how to access a WebAPI service,但出现编译错误:

Product product = await response.Content.ReadAsAsync<Product>();
response = await client.PostAsJsonAsync("api/products", gizmo);

response = await client.PutAsJsonAsync(gizmoUrl, gizmo);

我引用了 System.Net.Http,其中apparently 包含无法编译的三个方法:ReadAsAsync()、PostAsJsonAsync() 和 PutAsJsonAsync()。虽然扩展类没有出现在程序集的 ObjectBrowser 中,所以我不相信我有正确的版本(我的版本是 4.0.30319.18402)。

我正在使用最新的 nuGet Microsoft.AspNet.WebApi.Client 包 (5.1.2),所以我认为我拥有所需的一切。

任何人都可以看到为什么代码无法编译或我缺少什么:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace WebApiClient

class Program

    static void Main()
    
        RunAsync().Wait();
    
    static async Task RunAsync()
    
        using (var client = new HttpClient())
        
            client.BaseAddress = new Uri("http://localhost:54122/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // HTTP GET
            HttpResponseMessage response = await client.GetAsync("api/products/1");
            if (response.IsSuccessStatusCode)
            
                //***********
                Product product = await response.Content.ReadAsAsync<Product>();
                //***********
                Console.WriteLine("0\t$1\t2", product.Name, product.Price, product.Category);
            

            // HTTP POST
            var gizmo = new Product()  Name = "Gizmo", Price = 100, Category = "Widget" ;

            //***********
            response = await client.PostAsJsonAsync("api/products", gizmo);
            //***********
            if (response.IsSuccessStatusCode)
            
                Uri gizmoUrl = response.Headers.Location;

                // HTTP PUT
                gizmo.Price = 80;   // Update price

                //***********
                response = await client.PutAsJsonAsync(gizmoUrl, gizmo);
                //***********

                // HTTP DELETE
                response = await client.DeleteAsync(gizmoUrl);
            
        
    


谢谢。

【问题讨论】:

Where is HttpContent.ReadAsAsync? 的可能副本 【参考方案1】:

原来我需要参考 System.Net.Http.Formatting。

我觉得这是 nuGet Microsoft.AspNet.WebApi.Client 包的一部分。

【讨论】:

你是说你安装了Microsoft.AspNet.WebApi.Client 包但是引用没有添加到你的项目中? 是的,没错。它只在我安装另一个 NuGet 包 (WebAPIDoodle.Http) 时出现,我安装它纯粹是因为我认为它会给我 System.Net.Http.Formatting。 我刚刚在 VS 2013 中的一个全新控制台应用程序中再次尝试了它,它确实可以正常工作。我猜您可能不小心将客户端软件包安装到了另一个项目中。但是,如果您可以得到一个可靠的安装包并且没有获得参考,请在aspnetwebstack.codeplex.com/workitem/list/basic 上为我们打开一个错误。谢谢! 谢谢一晒。我在一个空白解决方案上进行了尝试,它奏效了。一定是用户错误。再次感谢。

以上是关于如何使用 HttpContentExtensions.ReadAsAsync<T>()?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?