'System.Net.Http.HttpContent' не містить визначення для 'ReadAsAsync' і не має методу розширення


97

Я створив консольний додаток для використання веб-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.

Відповіді:


140

Після тривалої боротьби я знайшов рішення.

Рішення: Додайте посилання на System.Net.Http.Formatting.dll. Ця збірка також доступна в папці C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

Метод ReadAsAsync- це метод розширення, оголошений у класі HttpContentExtensions, який знаходиться у просторі імен System.Net.Httpу бібліотеці System.Net.Http.Formatting.

На допомогу прийшов рефлектор!


7
Самовідповіді, які допомагають іншим гойдати околиці!
granadaCoder

Як ти потрапив ту папку? Я використовував інсталятор веб-платформи, і він не зробив цю папку в програмних файлах.
bladefist

5
Додати посилання -> Збірки -> Розширення. Якщо його немає в списку, перейдіть у поле Search Assembly і введіть "форматування". Сподіваємось, вам це стане простіше.
FrankO

1
Оновлення, я знайшов своє тут: C: \ Program Files (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.Extention - будь-яка причина не використовувати це?
WernerCD,

93

Переконайтеся, що ви встановили програму correct NuGet packageв консолі:

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

і що ви націлюєтеся принаймні на .NET 4.0.

Сказано, ваша GetAllFoosфункція визначена для повернення, IEnumerable<Prospect>тоді як у вашому ReadAsAsyncметоді, який ви передаєте, IEnumerable<Foo>очевидно, не є сумісними типами.

Install-Package Microsoft.AspNet.WebApi.Client

Виберіть проект у консолі менеджера проекту


Дякую. Це було промахом, що залишився від моїх зусиль видалити бізнес-код і замінити його на Foos.
Water Cooler v2

Я не розумію. Я вже орієнтуюсь на .NET 4.0 в моїх властивостях консолі. Чи потрібно встановлювати посилання на цю бібліотеку Microsoft.AspNet.WebAPI.Client.dll? Я ніколи не встановлював таких посилань у проекті ASP.NET MVC, які також споживають мій веб-API і працюють чудово.
Водяний кулер v2

5
Вам потрібно встановити Microsoft.AspNet.WebApi.ClientNuGet. Це завантажить останню версію з Інтернету та посилання на збірку у вашому консольному додатку. Це саме те, що робить шаблон проекту ASP.NET MVC, і саме тому вам не потрібно нічого встановлювати, щоб він працював. Але у вашій консольній програмі такого немає.
Дарін Димитров

1
Дякую. Я зробив те, що ти сказав. У моєму рішенні 12 проектів, але з незрозумілої причини, після того, як я сказав «констатувати пакет Microsoft.AspNet.WebApi.Client» на консолі «Менеджер пакетів бібліотеки», він надрукував звичайний слід і потім сказав: «Успішно встановлено Microsoft.AspNet .WebApi.Client у MyMVCProjectNameAndNotMyConsoleProjectName '. Наступного разу, коли я вибрав свій проект консолі та ввів те саме в консолі менеджера пакетів. Там сказано, що MyMVCProjectName вже посилається на Microsoft.AspNet.WebApi.Client. Я збентежений.
Водяний кулер v2

Та мені теж. Починати з нуля. Нова консольна програма, відкрийте консоль NuGet, введіть Install-Package Microsoft.AspNet.WebApi.Clientі спробуйте код.
Дарин Димитров

20
  • якщо ви не можете знайти посилання на збірку з часу (клацніть правою кнопкою миші на посиланні -> додайте необхідну збірку)

спробуйте цю консоль диспетчера пакетів
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3, а потім додайте за допомогою додавання посилань.


2
Я мігрував додаток dotnetcore з останньої версії 2.2 до 3.1 і стикався з цією помилкою. Мій додаток вже має посилання на System.Net.Http.Formatting.Extension v5.2.3, але мій додаток скаржиться на цю помилку, тому я встановив нукетний пакет Microsoft.AspNet.WebApi Клієнт, як пропонують Рікін і Дарін, і після вирішення цього питання. Дякую
AKS

12

Додавання посилання на System.Net.Http.Formatting.dll може спричинити невідповідність DLL. Зараз, здається, System.Net.Http.Formatting.dll посилається на версію 4.5.0.0 Newtonsoft.Json.DLL, тоді як остання версія - 6.0.0.0. Це означає, що вам потрібно буде також додати перенаправлення на прив’язку, щоб уникнути винятку .NET Assembly, якщо ви посилаєтесь на останній пакет Newtonsoft NuGet або 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> 

Тому альтернативним рішенням для додавання посилання на 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;
      }
}

9

або якщо у вас є VS 2012, ви можете зайти в консоль менеджера пакунків і ввести Install-Package Microsoft.AspNet.WebApi.Client

Це дозволить завантажити останню версію пакета


Це зафіксувало це для мене. - за допомогою VS2013
Ден

якщо у вас вже є пакет Microsoft.AspNet.WebApi.Client, спробуйте видалити та встановити його, що виправило мою проблему для v 5.2.3
Naveen,

-1

ЗАСТОСУЙТЕ цей довідковий збірник у своєму проекті

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

6
Прийнята відповідь від січня 2013 року вже пояснює це та містить більше інформації. Ваша відповідь також неправильно відформатована.
user247702
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.