HttpClient不支持PostAsJsonAsync方法C#

Jid*_*jan 223 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 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;
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

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;
Run Code Online (Sandbox Code Playgroud)

请看看并给我建议.

Jus*_*vey 389

是的,您需要添加引用

System.Net.Http.Formatting.dll
Run Code Online (Sandbox Code Playgroud)

这可以在扩展程序集区域中找到.

实现这一目标的一个好方法是将NuGet包添加__CODE__到项目中.

  • 发现我必须添加NuGet包"Microsoft.AspNet.WebApi.Client"以确保格式化dll的版本在我的项目中使用.NET框架版本的"System.Net.Http". (85认同)
  • 为什么引用标准系统程序集要求我从Internet上的随机位置下载开源内容以使其正常运行?如果无法解析其依赖关系,为什么这甚至会编译?这让我感到震惊! (24认同)
  • 现在我收到一个错误:"无法加载文件或程序集'Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'或其中一个依赖项.系统找不到指定的文件." (7认同)
  • @Neutrino你想自己编写代码吗?你应该感谢微软和其他地方的人们编写了你可以免费使用的代码 (4认同)
  • PM> Install-Package System.Net.Http.Formatting.Extension (4认同)
  • 进入NuGet并在在线软件包下查找Json.NET,或者你可以从这里下载如果你没有使用NuGet从这里获取它http://james.newtonking.com/json (2认同)

Jer*_*n K 168

PostAsJsonAsync不再是System.Net.Http.dll(.NET 4.5.2).您可以添加引用System.Net.Http.Formatting.dll,但这实际上属于旧版本.我在TeamCity构建服务器上遇到了这个问题,这两个不会合作.

或者,您可以PostAsJsonAsync使用PostAsync呼叫替换,这只是新dll的一部分.更换

var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;
Run Code Online (Sandbox Code Playgroud)

附:

var response = client.PostAsync("api/AgentCollection", new StringContent(
   new JavaScriptSerializer().Serialize(user), Encoding.UTF8, "application/json")).Result;
Run Code Online (Sandbox Code Playgroud)

请参阅https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836

  • 这应该是答案.做某事的最好方法是正确的方法 (6认同)
  • 到目前为止,这是最好的答案.不要尝试添加NuGet包或dll. (4认同)
  • 完全是最好的答案.选择的答案不是_at all_的最佳实践,事实上Microsoft建议不要引用DLL (3认同)
  • 要使用类型而不是“application/json”,您可以使用 MediaTypeNames.Application.Json https://docs.microsoft.com/en-us/dotnet/api/system.net.mime.mediatypenames.application.json?view =netcore-2.2 (3认同)
  • 离题,但我还是想提一下:使用`await FooAsync()`代替`FooAsync()。Result`。后者可能会陷入僵局。请参阅/sf/ask/1207407631/及其接受的答案。也有关于细节的良好链接。 (2认同)
  • 发挥了作用 - 我成功地使用 JsonConvert.SerializeObject(user) 代替了您的序列化程序。 (2认同)

Tod*_* H. 158

缺少的参考是System.Net.Http.Formatting.dll.但更好的解决方案是添加NuGet包Microsoft.AspNet.WebApi.Client以确保格式化dll的版本与System.Net.Http我项目中的.NET框架版本一起使用.


Chr*_*rdt 32

正如已经宣布的那样,自.NET 4.5.2起,这种方法就不再可用了.要扩展Jeroen K的答案,您可以制作扩展方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

现在你可以打电话了client.PostAsJsonAsync("api/AgentCollection", user).


Mr *_*les 10

我刚从源代码控制中检出的项目中也遇到了这个问题.

症状是上面描述的错误和引用的黄色警告三角形 System.Net.Http.Formatting

为了解决这个问题,我删除了损坏的引用,然后使用NuGet安装最新版本的Microsoft.AspNet.WebApi.Client.

  • 有用!要通过Nuget Console安装,请输入`Install-Package Microsoft.AspNet.WebApi.Client` (2认同)

小智 5

我知道这个回复太晚了,我遇到了同样的问题,我正在添加System.Net.Http.Formatting.ExtensionNuget,在这里和那里检查后我发现添加了 Nuget 但System.Net.Http.Formatting.dll没有添加到引用中,我只是重新安装了 Nuget


小智 5

尝试在您的项目中安装 NuGet 包:Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client
Run Code Online (Sandbox Code Playgroud)


Pav*_*nin 5

好吧,现在是世界末日 2020 年了,你可以在 NuGet 包中找到这些方法System.Net.Http.Json。但要注意它使用System.Text.Json内部使用的。

如果您确实需要找出哪个 API 驻留在何处,只需使用https://apisof.net/


小智 5

如果您已经在使用 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"));
Run Code Online (Sandbox Code Playgroud)

性能优于 JavaScriptSerializer。看看这里https://www.newtonsoft.com/json/help/html/Introduction.htm