299

我正在尝试从我的 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”的定义,并且找不到接受“System.Net.Http.HttpClient”类型的第一个参数的扩展方法“PostAsJsonAsync”(您是否缺少使用指令还是程序集引用?)

请看看并给我建议。

4

13 回答 13

510

是的,您需要添加对

System.Net.Http.Formatting.dll

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

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

于 2013-10-03T11:59:24.607 回答
220

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

或者,您可以替换PostAsJsonAsyncPostAsync调用,这只是新 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

于 2016-01-04T15:53:57.827 回答
169

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

于 2014-06-13T17:33:20.700 回答
39

正如已经讨论过的,这种方法自 .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)

于 2016-11-10T10:52:48.050 回答
13

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

症状是上面描述的错误和一个黄色警告三角形的参考System.Net.Http.Formatting

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

于 2017-03-17T09:29:54.133 回答
5

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

于 2016-10-19T08:37:56.553 回答
5

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

Install-Package Microsoft.AspNet.WebApi.Client
于 2019-05-31T18:39:56.010 回答
5

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

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

于 2020-09-22T18:48:54.950 回答
4

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

于 2021-02-12T11:14:35.613 回答
2

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

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

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

于 2014-06-13T19:06:01.990 回答
2

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

于 2019-12-03T13:15:29.407 回答
0

只需使用评论中的提示扩展Jeroen 的答案:

var content = new StringContent(
    JsonConvert.SerializeObject(user), 
    Encoding.UTF8, 
    MediaTypeNames.Application.Json);

var response = await client.PostAsync("api/AgentCollection", content);
于 2020-04-27T23:54:23.160 回答
0

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

HttpClient

System.Net.Http.HttpClient
于 2020-08-05T19:22:42.140 回答