121

作成したばかりのWebAPIを使用するためのコンソールアプリを作成しました。コンソールアプリのコードはコンパイルされません。それは私にコンパイルエラーを与えます:

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

4

8 に答える 8

155

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

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

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

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

于 2013-01-25T12:53:09.553 に答える
115

correct NuGet packageコンソールアプリケーションにがインストールされていることを確認してください。

<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />

少なくとも.NET4.0をターゲットにしていること。

そうは言っても、あなたのGetAllFoos関数は、明らかに互換性のない型であるあなたが渡すメソッドIEnumerable<Prospect>に対して、を返すように定義されています。ReadAsAsyncIEnumerable<Foo>

Install-Package Microsoft.AspNet.WebApi.Client

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

于 2013-01-25T11:26:30.450 に答える
34
  • いつからアセンブリ参照が見つからない場合(参照を右クリック->必要なアセンブリを追加)

この パッケージマネージャーコンソール
のInstall- PackageSystem.Net.Http.Formatting.Extension- Version 5.2.3を試してから、addreferenceを使用して追加してください。

于 2017-10-07T14:21:34.403 に答える
14

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;
      }
}
于 2016-02-05T13:59:39.457 に答える
9

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

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

于 2013-10-24T13:31:11.780 に答える
3

nugetから以下のパッケージをインストールします ここに画像の説明を入力してください

于 2021-11-24T04:34:57.583 に答える
2

同じ問題がありましたが、提案された回答は役に立ちませんでした。System.Net.Http.Jsonパッケージをインストールすると、エラーが削除されました。

于 2021-06-15T11:37:09.047 に答える
-1

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

Add a reference to System.Net.Http.Formatting.dll
于 2016-07-09T05:47:22.747 に答える