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


97

我制作了一个控制台应用程序以使用我刚制作的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客户端使用了它。

Answers:


140

经过长时间的努力,我找到了解决方案。

解决方案:添加对的引用System.Net.Http.Formatting.dll。该程序集也位于C:\ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies文件夹中。

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

反光板前来营救!


7
可以帮助他人震撼郊区的自我解答!
granadaCoder

您是如何找到那个文件夹的?我使用了Web平台安装程序,但没有在Program Files中创建该文件夹。
bladefist 2014年

5
添加参考->程序集->扩展。如果未列出,请转到“搜索程序集”框,然后键入“格式”。希望这对您来说更容易。
FrankO 2014年

1
一个更新,我在这里找到我的:C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph


93

确保已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

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


谢谢。这是一个遗漏,是我删除业务相关代码并将其替换为Foos时遗留下来的。
Water Cooler v2

我不明白 我已经在控制台应用程序属性中定位了.NET 4.0框架。我是否需要设置对此库Microsoft.AspNet.WebAPI.Client.dll的引用?我从未在ASP.NET MVC项目中设置过任何此类引用,这些引用也占用了我的Web API并且工作正常。
Water Cooler v2

5
您需要安装Microsoft.AspNet.WebApi.ClientNuGet。这将从互联网上下载最新版本,并在控制台应用程序中引用该程序集。这正是ASP.NET MVC项目模板所做的事情,这就是您无需安装任何程序即可运行的原因。但是在您的控制台应用程序中没有这样的东西。
Darin Dimitrov

1
谢谢。我照你说的做了 我的解决方案中有12个项目,但是出于某些奇怪的原因,在库管理器控制台中说“安装软件包Microsoft.AspNet.WebApi.Client”后,它打印了通常的跟踪记录,然后说“成功安装了Microsoft.AspNet” MyMVCProjectNameAndNotMyConsoleProjectName中的.WebApi.Client。下次我选择控制台项目并在包管理器控制台中键入相同的内容时。它说MyMVCProjectName已经引用了Microsoft.AspNet.WebApi.Client。我很困惑。
Water Cooler v2

我也是。白手起家。在新的控制台应用程序中,打开NuGet控制台,键入Install-Package Microsoft.AspNet.WebApi.Client并尝试代码。
Darin Dimitrov 2013年

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

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


2
我正在将dotnetcore应用程序从2.2迁移到最新的3.1,并且遇到此错误。我的应用程序已经引用了System.Net.Http.Formatting.Extension v5.2.3,但是我的应用程序抱怨此错误,所以我安装了nuget包Microsoft.AspNet.WebApi Rikin和Darin建议的.Client,该问题得到解决之后。谢谢
AKS

12

添加对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 Assembly异常:

<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;
      }
}

9

或者如果您具有VS 2012,则可以转到程序包管理器控制台,然后键入Install-Package Microsoft.AspNet.WebApi.Client

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


这为我解决了。-使用VS2013
Dan

如果你已经有了一个Microsoft.AspNet.WebApi.Client尝试软件包安装联合国和安装它,固定我的问题当V 5.2.3
纳文

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.