"System.Net.Http.HttpContent" non contiene una definizione per "ReadAsAsync" e nessun metodo di estensione


98

Ho creato un'app per console per utilizzare un'API Web appena creata. Il codice dell'app della console non viene compilato. Mi dà l'errore di compilazione:

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

Ecco un metodo di prova in cui si verifica questo errore.

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

Ho usato questo metodo e l'ho consumato da un client MVC.

Risposte:


140

Dopo una lunga lotta, ho trovato la soluzione.

Soluzione: aggiungi un riferimento a System.Net.Http.Formatting.dll. Questo assembly è disponibile anche nella cartella C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

Il metodo ReadAsAsyncè un metodo di estensione dichiarato nella classe HttpContentExtensions, che si trova nello spazio dei nomi System.Net.Httpnella libreria System.Net.Http.Formatting.

Il riflettore è venuto in soccorso!


7
Risposte autonome che aiutano gli altri a scuotere i sobborghi!
granadaCoder

Come hai portato quella cartella lì? Ho usato il programma di installazione della piattaforma web e non ha creato quella cartella in Programmi.
Bladefist

5
Aggiungi riferimento -> Assiemi -> Estensioni. Se non è elencato, vai alla casella Cerca assembly e digita "formattazione". Si spera che sia più facile per te.
FrankO

1
Un aggiornamento, ho trovato il mio qui: C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph

6

93

Assicurati di aver installato correct NuGet packagenella tua applicazione console:

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

e che stai prendendo di mira almeno .NET 4.0.

Detto questo, la tua GetAllFoosfunzione è definita per restituire un IEnumerable<Prospect>considerando che nel tuo ReadAsAsyncmetodo stai passando IEnumerable<Foo>che ovviamente non sono tipi compatibili.

Install-Package Microsoft.AspNet.WebApi.Client

Seleziona il progetto nella console del gestore di progetti


Grazie. È stato un errore, un residuo del mio tentativo di rimuovere il codice relativo alle attività commerciali e sostituirlo con Foos.
Water Cooler v2

Non capisco. Sto già prendendo di mira il framework .NET 4.0 nelle proprietà della mia app console. È necessario impostare un riferimento a questa libreria Microsoft.AspNet.WebAPI.Client.dll? Non ho mai impostato alcun riferimento di questo tipo nel progetto ASP.NET MVC che utilizza anche la mia API Web e funziona perfettamente.
Water Cooler v2

5
È necessario installare Microsoft.AspNet.WebApi.ClientNuGet. Questo scaricherà l'ultima versione da Internet e farà riferimento all'assembly nella tua applicazione console. Questo è esattamente ciò che fa il modello di progetto ASP.NET MVC ed è il motivo per cui non è necessario installare nulla affinché funzioni. Ma nella tua applicazione console non c'è niente di simile.
Darin Dimitrov

1
Grazie. Ho fatto quello che hai detto. Ho 12 progetti nella mia soluzione, ma per qualche strana ragione, dopo aver detto "install-package Microsoft.AspNet.WebApi.Client" nella console di Library Package Manager, ha stampato la sua traccia usuale e poi ha detto "Microsoft.AspNet installato con successo .WebApi.Client in MyMVCProjectNameAndNotMyConsoleProjectName '. La prossima volta che ho selezionato il mio progetto Console e ho digitato la stessa cosa nella console del gestore pacchetti. Ha detto che MyMVCProjectName fa già riferimento a Microsoft.AspNet.WebApi.Client. Sono confuso.
Water Cooler v2

Si, anch'io. Iniziare da zero. Nuova applicazione console, apri la console NuGet, digita Install-Package Microsoft.AspNet.WebApi.Cliente prova il codice.
Darin Dimitrov

21
  • se non riesci a trovare il riferimento all'assemblaggio da quando (Fare clic con il pulsante destro del mouse su riferimento -> aggiungi l'assieme richiesto)

prova questa console di gestione dei pacchetti
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 e poi aggiungi usando add reference.


2
Stavo migrando l'applicazione dotnetcore dalla 2.2 alla 3.1 più recente e ho riscontrato questo errore.La mia app ha già riferimento a System.Net.Http.Formatting.Extension v5.2.3 ma la mia app si lamenta di questo errore, quindi ho installato il pacchetto nuget Microsoft.AspNet.WebApi .Client come suggerito da Rikin e Darin e dopo che il problema è stato risolto. Grazie
AKS

12

L'aggiunta di un riferimento a System.Net.Http.Formatting.dll può causare problemi di mancata corrispondenza della DLL. In questo momento, System.Net.Http.Formatting.dll sembra fare riferimento alla versione 4.5.0.0 di Newtonsoft.Json.DLL, mentre l'ultima versione è 6.0.0.0. Ciò significa che dovrai anche aggiungere un reindirizzamento del binding per evitare un'eccezione di assembly .NET se fai riferimento all'ultimo pacchetto NuGet di Newtonsoft o DLL:

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

Quindi una soluzione alternativa per aggiungere un riferimento a System.Net.Http.Formatting.dll è leggere la risposta come una stringa e quindi desearalizzare te stesso con JsonConvert.DeserializeObject (responseAsString). Il metodo completo sarebbe:

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

oppure se hai VS 2012 puoi andare alla console del gestore pacchetti e digitare Install-Package Microsoft.AspNet.WebApi.Client

Questo scaricherà l'ultima versione del pacchetto


Questo ha risolto il problema per me. - utilizzando VS2013
Dan Rayson

se hai già un pacchetto Microsoft.AspNet.WebApi.Client prova a disinstallarlo e installarlo, il che ha risolto il mio problema per v 5.2.3
Naveen

-1

UTILIZZA questo riferimento all'assembly nel tuo progetto

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

6
La risposta accettata del gennaio 2013 lo spiega già e contiene ulteriori informazioni. Anche la tua risposta non è formattata correttamente.
user247702
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.