“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?)
以下是发生此错误的testing方法。
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客户端使用它。
经过漫长的斗争,我find了解决办法。
解决scheme:添加对System.Net.Http.Formatting.dll
的引用。 此程序集也位于C:\ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies文件夹中。
ReadAsAsync
方法是在类System.Net.Http
中的名称空间HttpContentExtensions
声明的扩展方法。
reflection器来救援!
确保您已经在控制台应用correct NuGet package
中安装了correct NuGet package
:
<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />
而且你的目标至less是.NET 4.0。
这GetAllFoos
,你的GetAllFoos
函数被定义为返回一个IEnumerable<Prospect>
而在你的ReadAsAsync
方法中,你传递的IEnumerable<Foo>
显然是不兼容的types。
Install-Package Microsoft.AspNet.WebApi.Client
或者如果你有VS 2012,你可以到包pipe理器控制台,然后键入Install-Package Microsoft.AspNet.WebApi.Client
这会下载最新版本的软件包
添加对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,则还需要添加绑定redirect以避免.NET程序集exception:
<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的引用的另一种解决scheme是将响应作为string读取,然后使用JsonConvert.DeserializeObject(responseAsString)进行desearalize自己。 完整的方法是:
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; } }
在您的项目中使用本大会参与
Add a reference to System.Net.Http.Formatting.dll
- 如果你无法从何时findassembly参考(右击参考 – >添加需要的assembly)
试试这个包pipe理器控制台
安装包System.Net.Http.Formatting.Extension –版本5.2.3,然后添加通过使用添加引用。