HttpClient不支持c# PostAsJsonAsync方法

我试图从我的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;

我得到了错误信息:

< p >错误:“System.Net.Http。的定义 'PostAsJsonAsync'和没有扩展方法'PostAsJsonAsync'接受的第一个参数 “System.Net.Http类型。HttpClient'可以被找到(你丢失了吗 一个using指令还是一个程序集引用?

请您看一下并给我建议。

333343 次浏览

是的,您需要添加一个引用

System.Net.Http.Formatting.dll

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

实现这一点的一个好方法是将NuGet包Microsoft.AspNet.WebApi.Client添加到项目中。

缺少的引用是System.Net.Http.Formatting.dll。但更好的解决方案是添加NuGet包Microsoft.AspNet.WebApi.Client,以确保格式化dll的版本与我的项目中的。net框架版本System.Net.Http兼容。

您可以使用internet上的一种包装器,而不是编写这么多代码来进行简单的调用。

我写了一个叫WebApiClient的程序,可以在NuGet上找到…点击这里查看详情!

https://www.nuget.org/packages/WebApiRestService.WebApiClient/

PostAsJsonAsync不再在System.Net.Http.dll(。净4.5.2)。你可以添加对System.Net.Http.Formatting.dll的引用,但这实际上属于一个较旧的版本。我在我们的TeamCity构建服务器上遇到了这个问题,这两个不能一起合作。

或者,你可以用PostAsync调用替换__abc0,它只是new dll的一部分。 替换< / p >
var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;

:

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

注意,JavaScriptSerializer在命名空间:System.Web.Script.Serialization中。

您必须在csproj: System.Web.Extensions.dll中添加程序集引用

看到https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836

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

正如已经讨论过的,这个方法在。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);
}

现在你可以调用client.PostAsJsonAsync("api/AgentCollection", user)了。

我在一个刚从源代码控制部门签出的项目中也遇到了这个问题。

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

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

试着在你的项目中安装NuGet包:

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

System.Net.Http.HttpClient

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

如果你真的需要找出哪个API驻留在哪里,只需使用https://apisof.net/

如果你已经在使用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。看看这里https://www.newtonsoft.com/json/help/html/Introduction.htm

如果你正在使用Blazor组件,并得到这个错误,这意味着你的组件无法找到http客户端。 在你的blazor组件上使用这条线
@inject HttpClient Http

确保在程序或启动文件中有这一行

builder.Services.AddScoped(sp =>
new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });


根据这里谈论使用Newtonsoft的答案。Json,我创建了一个helper类:

public class JsonContent : StringContent
{
public JsonContent(object model)
: base(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json")
{
}
}

使用示例:

using (var content = new JsonContent(user))
{
var response = client.PostAsync("api/AgentCollection", content).Result;
}