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.
asp.net
.net
asp.net-mvc
asp.net-web-api
Chłodnica wodna v2
źródło
źródło
Upewnij się, że zainstalowałeś
correct NuGet package
w 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
GetAllFoos
funkcja jest zdefiniowana tak, aby zwracałaIEnumerable<Prospect>
podczas gdy w twojejReadAsAsync
metodzie, którą przekazujesz,IEnumerable<Foo>
które oczywiście nie są kompatybilnymi typami.Install-Package Microsoft.AspNet.WebApi.Client
źródło
Microsoft.AspNet.WebApi.Client
pakiet 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.Install-Package Microsoft.AspNet.WebApi.Client
i wypróbuj kod.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.
źródło
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; } }
źródło
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
źródło
UŻYJ tego referatu w swoim projekcie
Add a reference to System.Net.Http.Formatting.dll
źródło