【问题标题】:'System.Net.Http.HttpContent' does not contain a definition for 'ReadAsAsync' and no extension method“System.Net.Http.HttpContent”不包含“ReadAsAsync”的定义,也没有扩展方法
【发布时间】:2013-01-09 08:31:34
【问题描述】:

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

【问题讨论】:

    标签: asp.net .net asp.net-mvc asp.net-web-api


    【解决方案1】:

    从 nuget 安装下面的包

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        • 如果您无法从何时找到程序集参考(右键单击参考 -> 添加所需的程序集)

        试试这个 包管理器控制台
        安装包 System.Net.Http.Formatting.Extension -版本 5.2.3 然后使用 add reference 添加。

        【讨论】:

        • 我正在将 dotnetcore 应用程序从 2.2 迁移到最新的 3.1 并遇到此错误。我的应用程序已经引用了 System.Net.Http.Formatting.Extension v5.2.3 但我的应用程序抱怨此错误,所以我按照 Rikin 和 Darin 的建议安装了 nuget 包 Microsoft.AspNet.WebApi.Client,然后解决了该问题。谢谢
        【解决方案4】:

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

        Add a reference to System.Net.Http.Formatting.dll
        

        【讨论】:

        • 2013 年 1 月接受的答案已经解释了这一点并提供了更多信息。您的答案格式也不正确。
        【解决方案5】:

        添加对 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;
              }
        }
        

        【讨论】:

          【解决方案6】:

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

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

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

          话虽如此,您的 GetAllFoos 函数被定义为返回 IEnumerable&lt;Prospect&gt;,而在您的 ReadAsAsync 方法中,您传递的 IEnumerable&lt;Foo&gt; 显然不是兼容的类型。

          Install-Package Microsoft.AspNet.WebApi.Client

          【讨论】:

          • 谢谢。那是一个失误,是我努力删除业务相关代码并将其替换为 Foos 的结果。
          • 我不明白。我已经在我的控制台应用程序属性中定位了 .NET 4.0 框架。我是否需要设置对此库 Microsoft.AspNet.WebAPI.Client.dll 的引用?我从来没有在 ASP.NET MVC 项目中设置任何这样的引用,它也使用我的 Web API 并且工作得很好。
          • 您需要安装Microsoft.AspNet.WebApi.Client NuGet。这将从 Internet 下载最新版本并在您的控制台应用程序中引用程序集。这正是 ASP.NET MVC 项目模板所做的事情,也是您不需要安装任何东西就可以工作的原因。但是在您的控制台应用程序中没有这样的东西。
          • 谢谢。我照你说的做了。我的解决方案中有 12 个项目,但出于某种奇怪的原因,在库包管理器控制台中说“安装包 Microsoft.AspNet.WebApi.Client”之后,它打印了通常的跟踪,然后说“成功安装了 Microsoft.AspNet MyMVCProjectNameAndNotMyConsoleProjectName' 中的 .WebApi.Client。下次我选择我的控制台项目并在包管理器控制台中输入相同的内容时。它说 MyMVCProjectName 已经引用了 Microsoft.AspNet.WebApi.Client。我很困惑。
          • 是的,我也是。白手起家。新建控制台应用程序,打开 NuGet 控制台,输入 Install-Package Microsoft.AspNet.WebApi.Client 并尝试代码。
          【解决方案7】:

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

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

          【讨论】:

          • 这为我解决了问题。 - 使用VS2013
          • 如果您已经有 Microsoft.AspNet.WebApi.Client 软件包,请尝试取消安装和安装它,这解决了我的 v 5.2.3 问题
          【解决方案8】:

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

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

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

          反射器来救援了!

          【讨论】:

          • 帮助他人震撼郊区的自我回答!
          • 你是怎么把那个文件夹放在那里的?我使用了网络平台安装程序,它没有在 Program Files 中创建该文件夹。
          • 添加参考 -> 程序集 -> 扩展。如果未列出,请转到“搜索程序集”框并键入“格式化”。希望这对您来说更容易。
          • 更新,我在这里找到了我的:C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Packages\Microsoft.AspNet.WebApi.Client.4.0.30506.0\ lib\net40
          猜你喜欢
          • 2015-07-27
          • 1970-01-01
          • 1970-01-01
          • 2018-09-24
          • 1970-01-01
          • 2014-03-14
          • 2018-12-13
          • 1970-01-01
          相关资源
          最近更新 更多