Системы'.Чистая.Протоколу HTTP.HttpContent' не содержит определение для 'ReadAsAsync', а не метод расширения
Я сделал консольное приложение, чтобы использовать веб-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.
6 ответов:
после долгой борьбы, я нашел решение.
устранение: добавить ссылку
System.Net.Http.Formatting.dll
. Эта сборка также доступна в C:\Program файлы\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies.метод
ReadAsAsync
- Это метод расширения, объявленный в классеHttpContentExtensions
, который находится в пространстве именSystem.Net.Http
в библиотекеSystem.Net.Http.Formatting
.рефлектор пришел на помощь!
убедитесь, что вы установили
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
добавление ссылки на System.Net.Http.Formatting.dll может вызвать проблемы несоответствия DLL. Прямо сейчас, System.Net.Http.Formatting.dll появляется ссылка на версию 4.5.0.0 Newtonsoft.формат JSON.DLL, тогда как последняя версия-6.0.0.0. Это означает, что вам также нужно будет добавить перенаправление привязки, чтобы избежать исключения сборки .NET, если вы ссылаетесь на последний пакет 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; } }
или если у вас есть VS 2012, Вы можете перейти в консоль диспетчера пакетов и ввести Установка Пакета Microsoft.сеть САШ.Веб-API.Клиент
Это позволит загрузить последнюю версию пакета