web-dev-qa-db-ja.com

「System.Net.Http.HttpContent」には「ReadAsAsync」の定義は含まれておらず、拡張メソッドも含まれていません

作成したWeb 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クライアントから使用しました。

83
Water Cooler v2

長い闘争の後、私は解決策を見つけました。

解決策:System.Net.Http.Formatting.dllへの参照を追加します。このアセンブリは、C:\ Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assembliesフォルダーでも利用できます。

メソッドReadAsAsyncは、ライブラリSystem.Net.Httpの名前空間System.Net.Http.FormattingにあるクラスHttpContentExtensionsで宣言された拡張メソッドです。

リフレクターが助けに来ました!

119
Water Cooler v2

コンソールアプリケーションに 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

Select project in project manager console

82
Darin Dimitrov
  • いつからアセンブリ参照が見つからない場合(参照を右クリック->必要なアセンブリを追加)

これを試してくださいパッケージマネージャーコンソール
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;
      }
}
10
Conor Kelly

または、VS 2012を使用している場合は、パッケージマネージャーコンソールに移動し、Install-Package Microsoft.AspNet.WebApi.Clientと入力できます

これにより、パッケージの最新バージョンがダウンロードされます

8
Ram