방금 만든 웹 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 클라이언트에서 사용했습니다.
답변
오랜 투쟁 끝에 해결책을 찾았습니다.
솔루션 :에 대한 참조를 추가하십시오 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
입니다.
반사경이 구조하러 왔습니다!
답변
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
답변
- 언제부터 어셈블리 참조를 찾을 수없는 경우 (참조를 마우스 오른쪽 버튼으로 클릭-> 필요한 어셈블리 추가)
이 패키지 관리자 콘솔
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3을 시도한
다음 add reference를 사용하여 추가하십시오.
답변
System.Net.Http.Formatting.dll에 대한 참조를 추가하면 DLL 불일치 문제가 발생할 수 있습니다. 현재 System.Net.Http.Formatting.dll은 Newtonsoft.Json.DLL의 4.5.0.0 버전을 참조하는 것으로 보이지만 최신 버전은 6.0.0.0입니다. 즉, 최신 Newtonsoft NuGet 패키지 또는 DLL을 참조하는 경우 .NET 어셈블리 예외를 방지하기 위해 바인딩 리디렉션도 추가해야합니다.
<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가있는 경우 패키지 관리자 콘솔로 이동하여 Install-Package Microsoft.AspNet.WebApi.Client를 입력 할 수 있습니다.
최신 버전의 패키지를 다운로드합니다.
답변
프로젝트에서이 어셈블리 참조 사용
Add a reference to System.Net.Http.Formatting.dll
답변
