'System.Net.Http.HttpContent'不包含'ReadAsAsync'的定义,也没有扩展方法

Wat*_* v2 87 .net asp.net asp.net-mvc asp.net-web-api

我制作了一个控制台应用程序来使用我刚刚制作的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?)
Run Code Online (Sandbox Code Playgroud)

这是一种发生此错误的测试方法.

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;
}
Run Code Online (Sandbox Code Playgroud)

我使用过这种方法,并从MVC客户端使用它.

Wat*_* v2 122

经过长期的斗争,我找到了解决方案.

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

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

反射器来救援!

  • 自我答案,帮助其他人摇滚郊区! (6认同)
  • https://www.nuget.org/packages/System.Net.Http.Formatting.Extension - 任何不使用此的原因? (6认同)
  • 添加引用 - >程序集 - >扩展.如果未列出,请转到"搜索装配"框并键入"格式".希望你觉得它更容易. (5认同)
  • 更新,我在这里找到了我的:C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40 (2认同)

Dar*_*rov 87

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

<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />
Run Code Online (Sandbox Code Playgroud)

而且你的目标是至少.NET 4.0.

这就是说,你的GetAllFoos函数被定义为IEnumerable<Prospect>在你的ReadAsAsync方法中返回一个你通过IEnumerable<Foo>哪个显然不兼容的类型.

Install-Package Microsoft.AspNet.WebApi.Client

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

  • 您需要安装`Microsoft.AspNet.WebApi.Client` NuGet.这将从Internet下载最新版本,并在控制台应用程序中引用程序集.这正是ASP.NET MVC项目模板的作用,也是您不需要安装任何东西才能工作的原因.但是在你的控制台应用程序中没有这样的东西. (5认同)

小智 14

  • 如果您从何时开始找不到程序集引用(右键单击引用->添加所需的程序集)

尝试使用此 程序包管理器控制台
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3,然后使用添加引用进行添加。

  • 我正在将 dotnetcore 应用程序从 2.2 迁移到最新的 3.1 并遇到此错误。我的应用程序已经引用了 System.Net.Http.Formatting.Extension v5.2.3 但我的应用程序抱怨此错误,所以我安装了 nuget 包 Microsoft.AspNet.WebApi .客户按照 Rikin 和 Darin 的建议,问题解决后。谢谢 (3认同)

小智 11

添加对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> 
Run Code Online (Sandbox Code Playgroud)

因此,添加对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;
      }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

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

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