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


97

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

回答:


140

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

解決策:への参照を追加します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です。

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


7
他の人が郊外を揺るがすのに役立つ自己回答!
granadaCoder 2013

どうやってそこにそのフォルダを取得しましたか?Webプラットフォームインストーラーを使用しましたが、Program Filesにそのフォルダーが作成されませんでした。
ブレードフィスト2014年

5
参照の追加->アセンブリ->拡張機能。リストされていない場合は、[アセンブリの検索]ボックスに移動して、「フォーマット」と入力します。うまくいけば、それがあなたにとってより簡単になるでしょう。
FrankO 2014年

1
更新、私はここで私を見つけました:C:\ Program Files(x86)\ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph

6
nuget.org/packages/System.Net.Http.Formatting.Extension-これを使用しない理由はありますか?
WernerCD、2017年

93

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

プロジェクトマネージャーコンソールでプロジェクトを選択する


ありがとう。それはスリップでした。ビジネス関連のコードを削除してFoosに置き換えるという私の努力の余りです。
ウォータークーラーv2 2013年

わかりません。コンソールアプリのプロパティで既に.NET 4.0フレームワークを対象としています。このライブラリMicrosoft.AspNet.WebAPI.Client.dllへの参照を設定する必要がありますか?ASP.NET MVCプロジェクトでそのような参照を設定したことはありませんが、Web APIを使用して問題なく動作します。
ウォータークーラーv2 2013年

5
Microsoft.AspNet.WebApi.ClientNuGet をインストールする必要があります。これにより、インターネットから最新バージョンがダウンロードされ、コンソールアプリケーションでアセンブリが参照されます。それがまさにASP.NET MVCプロジェクトテンプレートが行うことであり、それを機能させるために何もインストールする必要がない理由です。しかし、コンソールアプリケーションにはそのようなものはありません。
Darin Dimitrov 2013年

1
ありがとう。私はあなたが言ったことをしました。私のソリューションには12個のプロジェクトがありますが、奇妙な理由により、ライブラリパッケージマネージャーコンソールで「install-package Microsoft.AspNet.WebApi.Client」と言った後、通常のトレースが出力され、「Microsoft.AspNetが正常にインストールされましたMyMVCProjectNameAndNotMyConsoleProjectNameの.WebApi.Client。次回、コンソールプロジェクトを選択し、パッケージマネージャーコンソールに同じものを入力しました。MyMVCProjectNameはすでにMicrosoft.AspNet.WebApi.Clientを参照していると述べています。私は混乱しています。
ウォータークーラーv2 2013年

ええ、私もです。ゼロから始めます。新しいコンソールアプリケーション、NuGetコンソールを開きInstall-Package Microsoft.AspNet.WebApi.Client、コードを入力して試してください。
Darin Dimitrov 2013年

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

この パッケージマネージャーコンソール
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3を試してから、add referenceを使用して追加します。


2
私はdotnetcoreアプリケーションを最新の2.2から3.1に移行していて、このエラーが発生しました。私のアプリはすでにSystem.Net.Http.Formatting.Extension v5.2.3を参照していますが、アプリがこのエラーを報告しているため、nugetパッケージMicrosoft.AspNet.WebApiをインストールしました.RikinとDarinによって提案されたクライアント。その後、問題は解決されます。ありがとう
AKS

12

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;
      }
}

9

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

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


これで解決しました。-VS2013を使用
Dan

既にMicrosoft.AspNet.WebApi.Clientパッケージがある場合は、アンインストールしてからインストールしてみてください。v5.2.3の問題が修正されました
Naveen

-1

このアセンブリ参照をプロジェクトで使用する

Add a reference to System.Net.Http.Formatting.dll

6
2013年1月に承認された回答はすでにこれを説明しており、より多くの情報があります。回答の形式も正しくありません。
user247702
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.