'System.Net.Http.HttpContent' не содержит определения для 'ReadAsAsync' и метода расширения

98

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

Кулер для воды v2
источник

Ответы:

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.

На помощь пришел рефлектор!

Кулер для воды v2
источник
7
Самостоятельные ответы, которые помогают другим раскачивать пригороды!
granadaCoder
Как вы попали туда эту папку? Я использовал установщик веб-платформы, и он не поместил эту папку в Program Files.
bladefist
5
Добавить ссылку -> Сборки -> Расширения. Если его нет в списке, перейдите в поле «Поиск сборок» и введите «форматирование». Надеюсь, вам будет легче.
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.Extension - есть ли причина не использовать это?
WernerCD
94

Убедитесь, что вы установили 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 и отлично работает.
Water Cooler v2
5
Вам необходимо установить Microsoft.AspNet.WebApi.ClientNuGet. Это загрузит последнюю версию из Интернета и укажет сборку в консольном приложении. Это именно то, что делает шаблон проекта ASP.NET MVC, и поэтому вам не нужно ничего устанавливать, чтобы он работал. Но в вашем консольном приложении такого нет.
Дарин Димитров
1
Спасибо. Я сделал то, что ты сказал. В моем решении 12 проектов, но по какой-то странной причине после того, как я сказал «install-package Microsoft.AspNet.WebApi.Client» в консоли диспетчера пакетов библиотек, он распечатал свою обычную трассировку, а затем сказал: «Успешно установлен Microsoft.AspNet. .WebApi.Client в MyMVCProjectNameAndNotMyConsoleProjectName '. В следующий раз я выбрал свой консольный проект и набрал то же самое в консоли диспетчера пакетов. Он сказал, что MyMVCProjectName уже ссылается на Microsoft.AspNet.WebApi.Client. Я смущен.
Кулер для воды v2
Да, я тоже. Начинать с нуля. Новое консольное приложение, откройте консоль NuGet, введите Install-Package Microsoft.AspNet.WebApi.Clientи попробуйте код.
Дарин Димитров
21
  • если вы не можете найти ссылку на сборку, когда (щелкните правой кнопкой мыши ссылку -> добавить требуемую сборку)

попробуйте эту консоль диспетчера пакетов
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, но мое приложение жалуется на эту ошибку, поэтому я установил пакет nuget 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, попробуйте деинсталлировать и установить его, это устранило мою проблему для версии 5.2.3
Naveen
-1

ИСПОЛЬЗУЙТЕ эту ссылку на сборку в своем проекте

Add a reference to System.Net.Http.Formatting.dll
Дебендра Даш
источник
6
Принятый ответ от января 2013 года уже объясняет это и содержит дополнительную информацию. Ваш ответ также неправильно отформатирован.
user247702 08