121

我制作了一个控制台应用程序来使用我刚刚制作的 Web API。控制台应用程序代码无法编译。它给了我编译错误:

'System.Net.Http.HttpContent' does not contain a definition for 
'ReadAsAsync' and no extension method 'ReadAsAsync' accepting a 
first argument of type 'System.Net.Http.HttpContent' could be 
found (are you missing a using directive or an assembly reference?)

这是发生此错误的测试方法。

static IEnumerable<Foo> GetAllFoos()
{
  using (HttpClient client = new HttpClient())
  {
    client.DefaultRequestHeaders.Add("appkey", "myapp_key");

    var response = client.GetAsync("http://localhost:57163/api/foo").Result;

    if (response.IsSuccessStatusCode)
      return response.Content.ReadAsAsync<IEnumerable<Foo>>().Result.ToList();
  }

  return null;
}

我已使用此方法并从 MVC 客户端使用它。

4

8 回答 8

155

经过长时间的斗争,我找到了解决办法。

解决方案:添加对System.Net.Http.Formatting.dll. 此程序集也可在C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies文件夹中找到。

该方法ReadAsAsync是在类中声明的扩展方法,位于库HttpContentExtensions的命名空间中。System.Net.HttpSystem.Net.Http.Formatting

反光板来救场了!

于 2013-01-25T12:53:09.553 回答
115

确保您已correct NuGet package在控制台应用程序中安装:

<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />

并且您的目标至少是 .NET 4.0。

话虽这么说,您的GetAllFoos函数被定义为返回一个IEnumerable<Prospect>而在您ReadAsAsync传递的方法IEnumerable<Foo>中显然不是兼容的类型。

Install-Package Microsoft.AspNet.WebApi.Client

在项目管理器控制台中选择项目

于 2013-01-25T11:26:30.450 回答
34
  • 如果您无法从何时找到程序集参考(右键单击参考->添加所需的程序集)

试试这个 包管理器控制台
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 然后使用 add reference 添加。

于 2017-10-07T14:21:34.403 回答
14

添加对 System.Net.Http.Formatting.dll 的引用可能会导致 DLL 不匹配问题。目前,System.Net.Http.Formatting.dll 似乎引用了 Newtonsoft.Json.DLL 的 4.5.0.0 版本,而最新版本是 6.0.0.0。这意味着如果您引用最新的 Newtonsoft NuGet 包或 DLL,您还需要添加绑定重定向以避免 .NET 程序集异常:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
 </dependentAssembly> 

因此,添加对 System.Net.Http.Formatting.dll 的引用的另一种解决方案是将响应读取为字符串,然后使用 JsonConvert.DeserializeObject(responseAsString) 对自己进行反序列化。完整的方法是:

public async Task<T> GetHttpResponseContentAsType(string baseUrl, string subUrl)
{
     using (var client = new HttpClient())
     {
         client.BaseAddress = new Uri(baseUrl);
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

         HttpResponseMessage response = await client.GetAsync(subUrl);
         response.EnsureSuccessStatusCode();
         var responseAsString = await response.Content.ReadAsStringAsync();
         var responseAsConcreteType = JsonConvert.DeserializeObject<T>(responseAsString);
         return responseAsConcreteType;
      }
}
于 2016-02-05T13:59:39.457 回答
9

或者如果您有 VS 2012,您可以转到包管理器控制台并输入 Install-Package Microsoft.AspNet.WebApi.Client

这将下载最新版本的软件包

于 2013-10-24T13:31:11.780 回答
3

从nuget安装下面的包 在此处输入图像描述

于 2021-11-24T04:34:57.583 回答
2

有同样的问题,但提出的答案没有帮助,安装 System.Net.Http.Json 包删除了错误。

于 2021-06-15T11:37:09.047 回答
-1

在您的项目中使用此程序集参考

Add a reference to System.Net.Http.Formatting.dll
于 2016-07-09T05:47:22.747 回答