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

10

我正在尝试通过一个解释如何访问WebAPI服务的教程在VS2013(.net 4.5.1)中进行学习,但是我遇到了以下代码出现编译错误:

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

并且

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

我已经引用了System.Net.Http,其中显然包含三个方法,但这些方法无法编译:ReadAsAsync()、PostAsJsonAsync()和PutAsJsonAsync()。尽管扩展类在程序集中未显示,因此我不能确定我是否拥有正确的版本(我拥有的版本是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}\t{2}", 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?的重复问题。 - Keith Pinson
1个回答

22

结果是我需要引用 System.Net.Http.Formatting。

我以为这是 nuGet Microsoft.AspNet.WebApi.Client 包的一部分。


你是说你安装了 Microsoft.AspNet.WebApi.Client 包,但是引用没有添加到你的项目中? - Yishai Galatzer
是的,没错。它只在我安装了另一个NuGet包(WebAPIDoodle.Http)后出现,我之所以安装它纯粹是因为我认为它会给我提供System.Net.Http.Formatting。 - Badgerspot
我刚刚在Visual Studio 2013中的一个全新控制台应用程序中再次尝试了一下,它确实能够正确工作。我猜想你可能意外地将客户端包安装到了另一个项目中。但是,如果你能够找到一个可靠的重现步骤来安装包并且没有获取引用,请在http://aspnetwebstack.codeplex.com/workitem/list/basic上为我们开启一个bug。谢谢! - Yishai Galatzer
谢谢Yishai。我在一个空白的解决方案上尝试了一下,它起作用了。一定是我的错误。再次感谢。 - Badgerspot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接