[asp.net] ‘System.Net.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 클라이언트에서 사용했습니다.



답변

오랜 투쟁 끝에 해결책을 찾았습니다.

솔루션 :에 대한 참조를 추가하십시오 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


답변