【问题标题】:HttpClient not supporting PostAsJsonAsync method C#HttpClient 不支持 PostAsJsonAsync 方法 C#
【发布时间】:2023-03-23 20:55:01
【问题描述】:

我正在尝试从我的 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' 接受第一个参数 可以找到类型“System.Net.Http.HttpClient”(您是否缺少 using 指令还是程序集引用?)

请看一下并给我建议。

【问题讨论】:

  • 最好的选择是添加 'Microsoft.AspNet.WebApi.Client' .Nuget 包。就是这样!

标签: c# json asp.net-web-api dotnet-httpclient


【解决方案1】:

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

System.Net.Http.Formatting.dll

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

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

【讨论】:

  • 现在我收到一个错误:“无法加载文件或程序集 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其依赖项之一。系统无法找到指定的文件。"
  • 发现我必须添加 NuGet 包“Microsoft.AspNet.WebApi.Client”以确保格式化 dll 的版本与我的 .NET 框架版本的“System.Net.Http”一起使用项目。
  • 为什么引用标准系统程序集需要我从 Internet 上的随机位置下载开源内容才能使其运行?如果它无法解决其依赖关系,为什么还要编译?这让我很恼火!
  • @Neutrino 您愿意自己编写代码吗?你应该感谢微软和其他地方的人编写了可以免费使用的代码
  • PM> 安装包 System.Net.Http.Formatting.Extension
【解决方案2】:

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

【讨论】:

  • 这应该是答案。做某事最好的方法就是正确的方法
  • 这是迄今为止最好的答案。不要尝试添加 NuGet 包或 dll。
  • 完全是最佳答案。选择的答案不是最佳实践根本,事实上微软建议不要引用 DLLs
  • 离题了,但我还是想提一下:使用await FooAsync() 而不是FooAsync().Result。后一种可能会死锁。请参阅stackoverflow.com/q/17248680/2272514 及其接受的答案。也有很好的关于细节的链接。
  • 要使用类型而不是“application/json”,您可以使用 MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
【解决方案3】:

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

【讨论】:

  • @Yuval - 我现在意识到我建议的“解决方案”听起来像是评论。事实证明,Andreo 编写了我建议的 NuGet 包。
  • 这就是我的答案! (对我的问题)
【解决方案4】:

正如已经讨论过的,这种方法自 .NET 4.5.2 起不再可用。要扩展Jeroen K's answer,您可以创建一个扩展方法:

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)

【讨论】:

    【解决方案5】:

    我刚刚从源代码管理中签出的项目也遇到了这个问题。

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

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

    【讨论】:

    • 有效!要通过 Nuget 控制台安装,请输入 Install-Package Microsoft.AspNet.WebApi.Client
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      Install-Package Microsoft.AspNet.WebApi.Client
      

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 适用于 .net 框架和 netcore3.1(在此库中使用 netstandard2.0)
        【解决方案9】:

        如果你已经在使用 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

        【讨论】:

          【解决方案10】:

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

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

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

          【讨论】:

          • @Andreo 链接 (webapiclient.azurewebsites.net) 现在已于 2017 年 11 月 30 日断开。 NuGet 工作链接是nuget.org/packages/WebApiRestService.WebApiClient
          • 不幸的是,微软已经结束了我的 azure 订阅,并且 url 不再有效:​​(
          • 实际上,这很好地说明了为什么使用“互联网上可用的包装器之一”可能不是一个好主意。项目所具有的每一个外部依赖项都是另一件可能出错的事情。
          【解决方案11】:

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

          【讨论】:

            【解决方案12】:

            只需使用 cmets 中的提示扩展 Jeroen's answer

            var content = new StringContent(
                JsonConvert.SerializeObject(user), 
                Encoding.UTF8, 
                MediaTypeNames.Application.Json);
            
            var response = await client.PostAsync("api/AgentCollection", content);
            

            【讨论】:

              【解决方案13】:

              对我来说,经过大量尝试后,我找到了解决方案

              HttpClient
              

              System.Net.Http.HttpClient
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-04-10
                相关资源
                最近更新 更多