HttpClient 不支持 PostAsJsonAsync 方法 C#

本文关键字:方法 PostAsJsonAsync 不支持 HttpClient | 更新日期: 2023-09-27 18:33:40

我正在尝试从我的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;

我收到错误消息:

错误:"System.Net.Http.HttpClient"不包含 "PostAsJsonAsync"和"PostAsJsonAsync"没有扩展方法"PostAsJsonAsync"接受第一个参数 可以找到类型"System.Net.Http.HttpClient"(您是否缺少 using 指令还是程序集引用?

请看一看并建议我。

HttpClient 不支持 PostAsJsonAsync 方法 C#

是的

,您需要添加对

System.Net.Http.Formatting.dll

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

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

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;

跟:

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.dll。 但更好的解决方案是添加 NuGet 包Microsoft.AspNet.WebApi.Client,以确保格式化 dll 的版本适用于我的项目中 System.Net.Http 的 .NET 框架版本。

如前所述,此方法自 .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 System.Net.Http.Formatting.Extension,在这里和那里检查后,我发现添加了 Nuget,但System.Net.Http.Formatting.dll没有添加到引用中,我只是重新安装了 Nuget

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

Install-Package Microsoft.AspNet.WebApi.Client

好的,现在是世界末日的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

与其编写这么多代码来进行简单的调用,不如使用互联网上可用的包装器之一。

我写了一个名为WebApiClient的,可在NuGet上找到...看看吧!

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

如果你在 Blazor 中玩耍并收到错误,则需要将包添加到Microsoft.AspNetCore.Blazor.HttpClient

只是用评论中的提示扩展了 Jeroen 的答案:

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

如果使用 Blazor 组件并收到此错误,则表示组件无法找到 http 客户端。在 Blazor 组件的顶部使用此行。

@inject HttpClient Http

确保程序或启动文件中有此行

builder.Services.AddScoped(sp => 
new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
<</div> div class="answers">

基于这里关于使用 Newtonsoft.Json 的答案,我为此创建了一个帮助程序类:

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;
}