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

Water Cooler v2
fonte

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!

Water Cooler v2
fonte
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
6
nuget.org/packages/System.Net.Http.Formatting.Extension - alguma razão para não usar isso?
WernerCD
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

Darin Dimitrov
fonte
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.

Ganganath Rathnasekara
fonte
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;
      }
}
Conor Kelly
fonte
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

RAM
fonte
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
Debendra Dash
fonte
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