HttpClient不支持同步方法C#
我正在尝试从我的web应用程序调用web API。我正在使用.Net 4.5,在编写代码时,我发现错误HttpClient不支持同步方法C#,c#,json,asp.net-web-api,dotnet-httpclient,C#,Json,Asp.net Web Api,Dotnet Httpclient,我正在尝试从我的web应用程序调用web API。我正在使用.Net 4.5,在编写代码时,我发现错误HttpClient不包含定义PostAsJsonAsync方法 代码如下: HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:51093/"); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQual
HttpClient
不包含定义PostAsJsonAsync
方法
代码如下:
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:51093/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var user = new Users();
user.AgentCode = 100;
user.Remarks = "Test";
user.CollectionDate = System.DateTime.Today;
user.RemittanceDate = System.DateTime.Today;
user.TotalAmount = 1000;
user.OrgBranchID = 101;
var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;
我收到了错误信息:
错误:“System.Net.Http.HttpClient”不包含的定义
“PostAsJsonAsync”和不接受第一个参数的扩展方法“PostAsJsonAsync”
找不到类型“System.Net.Http.HttpClient”(是否缺少
使用指令或组件引用?)
请查看并给我建议。是的,您需要添加对的引用
System.Net.Http.Formatting.dll
这可以在扩展程序集区域中找到
实现这一点的一个好方法是将添加到项目中。缺少的参考是
System.Net.Http.Formatting.dll
。但更好的解决方案是添加NuGet包Microsoft.AspNet.WebApi.Client,以确保格式化dll的版本与我的项目中的.NET framework版本的System.NET.Http
配合使用 您可以使用internet上提供的一种包装器,而不是编写这么多代码来进行简单的调用
我写了一个叫做WebApiClient的,可以在NuGet上找到。。。看看
PostAsJsonAsync
不再位于系统.Net.Http.dll
(.Net 4.5.2)中。您可以添加对System.Net.Http.Formatting.dll
的引用,但这实际上属于旧版本。我在我们的TeamCity构建服务器上遇到了这个问题,这两个服务器不会合作
或者,您可以将PostAsJsonAsync
替换为postassync
调用,这只是新dll的一部分。
替换
与:
请注意,JavaScriptSerializer
位于命名空间中:System.Web.Script.Serialization
您必须在csproj中添加程序集引用:System.Web.Extensions.dll
请看我知道这个回复太迟了,我也遇到了同样的问题,我正在添加
System.Net.Http.Formatting.Extension
Nuget,在检查了这里和那里之后,我发现Nuget被添加了,但是System.Net.Http.Formatting.dll
没有添加到引用中,我只是重新安装了Nuget,正如已经讨论过的那样,自.NET 4.5.2以来,此方法不再可用。要展开,可以创建扩展方法:
public static async Task<HttpResponseMessage> PostAsJsonAsync<TModel>(this HttpClient client, string requestUrl, TModel model)
{
var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(model);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
return await client.PostAsync(requestUrl, stringContent);
}
公共静态异步任务PostAsJsonAsync(此HttpClient客户端,字符串请求URL,TModel模型)
{
var serializer=新的JavaScriptSerializer();
var json=serializer.Serialize(模型);
var stringContent=newstringcontent(json,Encoding.UTF8,“application/json”);
return wait client.PostAsync(requestUrl,stringContent);
}
现在您可以调用
client.postsjsonasync(“api/AgentCollection,user)”
我在一个刚从源代码管理签出的项目上也遇到了这个问题
症状是上述错误和对System.Net.Http.Formatting
为了修复此问题,我删除了断开的引用,然后使用NuGet安装最新版本的Microsoft.AspNet.WebApi.Client尝试在您的项目中安装NuGet软件包:Microsoft.AspNet.WebApi.Client:
Install-Package Microsoft.AspNet.WebApi.Client
如果您在Blazor中玩游戏时发现错误,则需要添加软件包Microsoft.AspNetCore.Blazor.HttpClient,只需使用注释中的提示进行扩展即可:
var content = new StringContent(
JsonConvert.SerializeObject(user),
Encoding.UTF8,
MediaTypeNames.Application.Json);
var response = await client.PostAsync("api/AgentCollection", content);
对我来说,我在多次尝试后找到了解决方案,它正在取代
HttpClient
与
好的,现在是世界末日2020年,您可以在NuGet package
System.Net.Http.Json
中找到这些方法。但是要注意,它在内部使用System.Text.Json
如果您真的需要找出哪个API驻留在哪里,如果您已经在使用Newtonsoft.Json,只需使用,试试以下方法:
// Alternative using WebApi.Client 5.2.7
////var response = await Client.PutAsJsonAsync(
//// "api/AgentCollection", user
//// requestListDto)
var response = await Client.PostAsync("api/AgentCollection", new StringContent(
JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json"));
性能优于JavaScriptSerializer。看看这里现在我得到一个错误:“无法加载文件或程序集'Newtonsoft.Json,Version=4.5.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6eed'或其依赖项之一。系统找不到指定的文件。”发现时,我必须添加NuGet包“Microsoft.AspNet.WebApi.Client”确保格式化dll的版本与我的项目中的.NET framework版本的“System.NET.Http”配合使用。为什么引用标准系统程序集需要我从Internet上的任意位置下载开源内容才能使其正常工作?如果它不能解析依赖项,为什么还要编译呢?这让我烦透了@中微子你愿意自己写代码吗?您应该感谢微软和其他地方的人编写了代码,可以用于freePM>Install Package System.Net.Http.Formatting。Extension@Yuval-我现在意识到,我提出的“解决方案”听起来像是一个评论。原来是Andreo编写了我建议的NuGet软件包。这就是我的答案!(对我的问题)这应该是答案。做某事的最好方法是正确的方法这是迄今为止最好的答案。不要尝试添加NuGet包或DLL。这完全是最好的答案。选择的答案根本不是最佳实践,事实上Microsoft建议不要引用DLLsOff主题,但我还是想提一提:使用
wait fooancy()
而不是fooancy()。Result
。后者可能会死锁。见及其公认的答案。还有关于详细信息的好链接。要使用类型而不是“application/json”,可以使用MediaTypeNames.application.json,最好的选择是添加“Microsoft.AspNet.WebApi.Client”.Nuget包。就这样!链接()现已于2017年11月30日断开。NuGet working链接很遗憾,Microsoft已结束我的azure订阅,url不再有效:(
HttpClient
System.Net.Http.HttpClient
// Alternative using WebApi.Client 5.2.7
////var response = await Client.PutAsJsonAsync(
//// "api/AgentCollection", user
//// requestListDto)
var response = await Client.PostAsync("api/AgentCollection", new StringContent(
JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json"));