Asp.net ';System.Net.Http.HttpContent';不包含';ReadAsAsync';没有扩展方法

Asp.net ';System.Net.Http.HttpContent';不包含';ReadAsAsync';没有扩展方法,asp.net,.net,asp.net-mvc,asp.net-web-api,Asp.net,.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 foun

我制作了一个控制台应用程序来使用我刚刚制作的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;
}
静态IEnumerable GetAllFoos()
{
使用(HttpClient=new HttpClient())
{
client.DefaultRequestHeaders.Add(“appkey”、“myapp_key”);
var response=client.GetAsync(“http://localhost:57163/api/foo三、结果;
if(响应。IsSuccessStatusCode)
返回response.Content.ReadAsAsync().Result.ToList();
}
返回null;
}

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

请确保已在控制台应用程序中安装:

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

您的目标至少是.NET4.0

也就是说,您的
GetAllFoos
函数被定义为返回
IEnumerable
,而在
ReadAsAsync
方法中,您传递的是
IEnumerable
,它们显然是不兼容的类型

安装软件包Microsoft.AspNet.WebApi.Client


经过长期的斗争,我找到了解决办法

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

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


我来救你

或者如果您有VS 2012,您可以转到package manager控制台并键入 安装软件包Microsoft.AspNet.WebApi.Client


这将下载包的最新版本,添加对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;
      }
}
公共异步任务GetHttpResponseContentAsType(字符串baseUrl、字符串子URL)
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
HttpResponseMessage response=wait client.GetAsync(子URL);
response.EnsureSuccessStatusCode();
var responseAsString=await response.Content.ReadAsStringAsync();
var responseAsConcreteType=JsonConvert.DeserializeObject(responseAsString);
返回响应类型;
}
}

在项目中使用此程序集引用

Add a reference to System.Net.Http.Formatting.dll
  • 如果从何时起无法找到程序集引用(右键单击引用->添加所需的程序集)
试试这个 软件包管理器控制台
安装软件包System.Net.Http.Formatting.Extension-版本5.2.3
然后使用add reference添加。

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

谢谢。这是一个失误,是我努力删除与业务相关的代码并用Foos替换的结果。我不明白。我已经在我的控制台应用程序属性中将.NET 4.0 framework作为目标。是否需要设置对此库的引用Microsoft.AspNet.WebAPI.Client.dll?我从未在ASP.NET MVC项目中设置过任何这样的引用,这些引用也会使用我的Web API,并且工作正常。您需要安装
Microsoft.AspNet.WebApi.Client
NuGet。这将从internet下载最新版本,并在控制台应用程序中引用程序集。这正是ASP.NET MVC项目模板所做的,也是您不需要安装任何东西就可以工作的原因。但是在您的控制台应用程序中没有这样的东西。谢谢。我照你说的做了。我的解决方案中有12个项目,但出于某种奇怪的原因,在我在Library package Manager控制台中说“安装包Microsoft.AspNet.WebApi.Client”之后,它打印了它的常规跟踪,然后说“在MyMVCProjectName和NotMyConsolleProjectName中成功安装了Microsoft.AspNet.WebApi.Client”。下次我选择控制台项目并在PackageManager控制台中键入相同的内容时。它说MyMVCProjectName已经引用了Microsoft.AspNet.WebApi.Client。我很困惑。是的,我也是。从头开始。新建控制台应用程序,打开NuGet控制台,键入
安装软件包Microsoft.AspNet.WebApi.Client
,然后尝试代码。自我回答可以帮助其他人解决问题!你是怎么弄到那个文件夹的?我使用了web平台安装程序,但它没有在程序文件中创建该文件夹。添加引用->程序集->扩展名。如果未列出,请转到“搜索程序集”框并键入“格式化”。希望这对您来说更容易。更新后,我在这里找到了我的:C:\Program Files(x86)\Microsoft ASP.NET\ASP.NET MVC 4\Packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\lib\net40-有什么理由不使用它吗?这为我修复了它。-使用VS2013如果您已经有Microsoft.AspNet.WebApi.Client软件包,请尝试取消安装并安装它,这解决了我在v 5.2.3中遇到的问题2013年1月接受的答案已经解释了这一点,并提供了更多信息。你的回答形式也不正确