作成した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クライアントから使用しました。
長い闘争の後、私は解決策を見つけました。
解決策: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
で宣言された拡張メソッドです。
リフレクターが助けに来ました!
コンソールアプリケーションに 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と入力できます
これにより、パッケージの最新バージョンがダウンロードされます