„System.Net.Http.HttpContent” nie zawiera definicji „ReadAsAsync” ani metody rozszerzenia

101

Zrobiłem aplikację konsolową, aby korzystać z właśnie utworzonego interfejsu API sieci Web. Kod aplikacji konsoli nie jest kompilowany. Daje mi błąd kompilacji:

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

Oto metoda testowa, w której występuje ten błąd.

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

Użyłem tej metody i wykorzystałem ją z klienta MVC.

Chłodnica wodna v2
źródło

Odpowiedzi:

141

Po długiej walce znalazłem rozwiązanie.

Rozwiązanie: dodaj odwołanie do System.Net.Http.Formatting.dll. Ten zestaw jest również dostępny w folderze C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

Metoda ReadAsAsyncjest metodą rozszerzającą zadeklarowaną w klasie HttpContentExtensions, która znajduje się w przestrzeni nazw System.Net.Httpw bibliotece System.Net.Http.Formatting.

Odbłyśnik przyszedł na ratunek!

Chłodnica wodna v2
źródło
7
Odpowiedzi, które pomagają innym wstrząsnąć przedmieściami!
granadaCoder
Jak dostałeś tam ten folder? Użyłem instalatora platformy internetowej i nie utworzył tego folderu w Program Files.
bladefist
5
Dodaj odniesienie -> Złożenia -> Rozszerzenia. Jeśli nie ma go na liście, przejdź do pola Wyszukaj zestawy i wpisz „formatowanie”. Miejmy nadzieję, że to będzie dla Ciebie łatwiejsze.
FrankO
1
Aktualizacja, którą znalazłem tutaj: C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph
7
nuget.org/packages/System.Net.Http.Formatting.Extension - czy jest jakiś powód, aby tego nie używać?
WernerCD
96

Upewnij się, że zainstalowałeś correct NuGet packagew swojej aplikacji konsolowej:

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

i że Twoim celem jest co najmniej .NET 4.0.

To powiedziawszy, twoja GetAllFoosfunkcja jest zdefiniowana tak, aby zwracała IEnumerable<Prospect>podczas gdy w twojej ReadAsAsyncmetodzie, którą przekazujesz, IEnumerable<Foo>które oczywiście nie są kompatybilnymi typami.

Install-Package Microsoft.AspNet.WebApi.Client

Wybierz projekt w konsoli kierownika projektu

Darin Dimitrov
źródło
Dzięki. To była pomyłka, pozostałość po moich próbach usunięcia kodu związanego z biznesem i zastąpienia go Foos.
Water Cooler v2
Nie rozumiem. Jestem już przeznaczony dla platformy .NET 4.0 we właściwościach aplikacji konsoli. Czy muszę ustawić odwołanie do tej biblioteki Microsoft.AspNet.WebAPI.Client.dll? Nigdy nie ustawiam żadnego takiego odwołania w projekcie ASP.NET MVC, który również korzysta z mojego interfejsu API sieci Web i działa dobrze.
Water Cooler v2
5
Musisz zainstalować Microsoft.AspNet.WebApi.Clientpakiet NuGet. Spowoduje to pobranie najnowszej wersji z Internetu i odniesienie do zestawu w aplikacji konsoli. Dokładnie to robi szablon projektu ASP.NET MVC i jest powodem, dla którego nie musisz niczego instalować, aby działał. Ale w twojej aplikacji konsoli nie ma czegoś takiego.
Darin Dimitrov
1
Dzięki. Zrobiłem, co powiedziałeś. Mam 12 projektów w swoim rozwiązaniu, ale z jakiegoś dziwnego powodu, po tym, jak powiedziałem „zainstaluj pakiet Microsoft.AspNet.WebApi.Client” w konsoli Library Package Manager, wydrukował swój zwykły ślad, a następnie powiedział: „Pomyślnie zainstalowano Microsoft.AspNet .WebApi.Client w MyMVCProjectNameAndNotMyConsoleProjectName '. Następnym razem, gdy wybrałem projekt konsoli i wpisałem to samo w konsoli menedżera pakietów. Powiedział, że MyMVCProjectName odwołuje się już do Microsoft.AspNet.WebApi.Client. Jestem zdezorientowany.
Water Cooler v2
Tak, ja też. Zaczynać od początku. Nowa aplikacja konsolowa, otwórz konsolę NuGet, wpisz Install-Package Microsoft.AspNet.WebApi.Clienti wypróbuj kod.
Darin Dimitrov
21
  • jeśli nie możesz znaleźć odniesienia do zestawu od kiedy (kliknij prawym przyciskiem myszy na odwołanie -> dodaj wymagany zestaw)

wypróbuj tę konsolę menedżera pakietów
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3, a następnie dodaj za pomocą dodawania odwołania.

Ganganath Rathnasekara
źródło
3
Migrowałem aplikację dotnetcore z wersji 2.2 do 3.1 i napotykam ten błąd.Moja aplikacja ma już odniesienie do System.Net.Http.Formatting.Extension v5.2.3, ale moja aplikacja zgłasza ten błąd, więc zainstalowałem pakiet NuGet Microsoft.AspNet.WebApi .Client zgodnie z sugestią Rikina i Darina, po czym problem został rozwiązany. Dzięki
AKS
12

Dodanie odwołania do System.Net.Http.Formatting.dll może spowodować problemy z niezgodnością DLL. Obecnie wydaje się, że System.Net.Http.Formatting.dll odwołuje się do wersji 4.5.0.0 Newtonsoft.Json.DLL, podczas gdy najnowsza wersja to 6.0.0.0. Oznacza to, że musisz również dodać przekierowanie powiązania, aby uniknąć wyjątku zestawu .NET, jeśli odwołujesz się do najnowszego pakietu NuGet Newtonsoft lub biblioteki 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> 

Tak więc alternatywnym rozwiązaniem dodania odwołania do System.Net.Http.Formatting.dll jest odczytanie odpowiedzi jako ciągu znaków, a następnie desearalizacja się za pomocą JsonConvert.DeserializeObject (responseAsString). Pełna metoda byłaby następująca:

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
źródło
9

lub jeśli masz VS 2012, możesz przejść do konsoli menedżera pakietów i wpisać Install-Package Microsoft.AspNet.WebApi.Client

Spowoduje to pobranie najnowszej wersji pakietu

Baran
źródło
To naprawiło to dla mnie. - używając VS2013
Dan Rayson
jeśli masz już pakiet Microsoft.AspNet.WebApi.Client, spróbuj go odinstalować i zainstalować, co rozwiązało mój problem z wersją 5.2.3
Naveen,
-1

UŻYJ tego referatu w swoim projekcie

Add a reference to System.Net.Http.Formatting.dll
Debendra Dash
źródło
7
Przyjęta odpowiedź ze stycznia 2013 r. Już to wyjaśnia i zawiera więcej informacji. Twoja odpowiedź również nie jest odpowiednio sformatowana.
user247702