'System.Net.Http.HttpContent' não contém uma definição para 'ReadAsAsync' e nenhum método de extensão


98

Fiz um aplicativo de console para consumir uma API da Web que acabei de fazer. O código do aplicativo do console não é compilado. Isso me dá o erro de compilação:

'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?)

Aqui está um método de teste no qual esse erro ocorre.

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

Usei esse método e o consumi de um cliente MVC.

Respostas:


140

Depois de uma longa luta, encontrei a solução.

Solução: adicione uma referência a System.Net.Http.Formatting.dll. Esta montagem também está disponível na pasta C: \ Arquivos de programas \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

O método ReadAsAsyncé um método de extensão declarado na classe HttpContentExtensions, que está no namespace System.Net.Httpda biblioteca System.Net.Http.Formatting.

O refletor veio para resgatar!


7
Auto-respostas que ajudam os outros a agitar os subúrbios!
granadaCoder

Como você conseguiu essa pasta lá? Usei o instalador da plataforma web e ele não criou essa pasta em Arquivos de programas.
bladefist

5
Adicionar Referência -> Assemblies -> Extensões. Se não estiver listado, vá para a caixa Pesquisar Assemblies e digite 'formatação'. Espero que seja mais fácil para você.
FrankO

1
Uma atualização, encontrei a minha aqui: C: \ Arquivos de programas (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph


93

Certifique-se de ter instalado o correct NuGet packageem seu aplicativo de console:

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

e que você tem como alvo pelo menos o .NET 4.0.

Dito isso, sua GetAllFoosfunção é definida para retornar um, IEnumerable<Prospect>enquanto em seu ReadAsAsyncmétodo você está transmitindo IEnumerable<Foo>tipos que obviamente não são compatíveis.

Install-Package Microsoft.AspNet.WebApi.Client

Selecione o projeto no console do gerente de projeto


Obrigado. Foi um lapso, um resquício de meu esforço para remover o código relacionado aos negócios e substituí-lo por Foos.
Water Cooler v2

Não entendo. Já estou visando a estrutura .NET 4.0 nas propriedades do meu aplicativo de console. Preciso definir uma referência para esta biblioteca Microsoft.AspNet.WebAPI.Client.dll? Eu nunca defini tal referência no projeto ASP.NET MVC que também consome minha API da Web e funciona muito bem.
Water Cooler v2

5
Você precisa instalar o Microsoft.AspNet.WebApi.ClientNuGet. Isso fará o download da versão mais recente da Internet e fará referência ao assembly em seu aplicativo de console. Isso é exatamente o que o modelo de projeto ASP.NET MVC faz e é a razão pela qual você não precisa instalar nada para que ele funcione. Mas em seu aplicativo de console não existe tal coisa.
Darin Dimitrov

1
Obrigado. Eu fiz o que você disse. Eu tenho 12 projetos em minha solução, mas por algum motivo estranho, depois que eu disse 'install-package Microsoft.AspNet.WebApi.Client' no console do Library Package Manager, ele imprimiu seu traço usual e disse 'Microsoft.AspNet instalado com sucesso .WebApi.Client in MyMVCProjectNameAndNotMyConsoleProjectName '. Na próxima vez, selecionei meu projeto de console e digitei a mesma coisa no console do gerenciador de pacotes. Ele disse que MyMVCProjectName já faz referência a Microsoft.AspNet.WebApi.Client. Estou confuso.
Water Cooler v2

Sim eu também. Começar do zero. Novo aplicativo de console, abra o console NuGet, digite Install-Package Microsoft.AspNet.WebApi.Cliente tente o código.
Darin Dimitrov

21
  • se você não conseguir encontrar a referência do assembly de quando (clique com o botão direito na referência -> adicionar o assembly necessário)

experimente este console do gerenciador de pacotes
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 e, em seguida, adicione usando adicionar referência.


2
Eu estava migrando o aplicativo dotnetcore do 2.2 para o 3.1 mais recente e encontrei este erro. Meu aplicativo já tem referência a System.Net.Http.Formatting.Extension v5.2.3, mas meu aplicativo reclama desse erro, então instalei o pacote nuget Microsoft.AspNet.WebApi .Cliente conforme sugerido por Rikin e Darin e depois que o problema for resolvido. Obrigado
AKS

12

Adicionar uma referência a System.Net.Http.Formatting.dll pode causar problemas de incompatibilidade de DLL. No momento, System.Net.Http.Formatting.dll parece fazer referência à versão 4.5.0.0 de Newtonsoft.Json.DLL, enquanto a versão mais recente é 6.0.0.0. Isso significa que você também precisará adicionar um redirecionamento de ligação para evitar uma exceção .NET Assembly se fizer referência ao pacote Newtonsoft NuGet ou DLL mais recente:

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

Portanto, uma solução alternativa para adicionar uma referência a System.Net.Http.Formatting.dll é ler a resposta como uma string e, em seguida, dessearalizar-se com JsonConvert.DeserializeObject (responseAsString). O método completo seria:

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

ou se você tiver o VS 2012, pode ir para o console do gerenciador de pacotes e digitar Install-Package Microsoft.AspNet.WebApi.Client

Isso faria o download da versão mais recente do pacote


Isso consertou para mim. - usando VS2013
Dan Rayson

se você já tem um pacote Microsoft.AspNet.WebApi.Client tente desinstalar e instalar, isso corrigiu meu problema para v 5.2.3
Naveen

-1

USE Esta Referência de Montagem em seu Projeto

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

6
A resposta aceita de janeiro de 2013 já explica isso e contém mais informações. Sua resposta também não está formatada corretamente.
user247702
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.