HttpClient不支持PostAsJsonAsync方法C#


255

我正在尝试从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”的第一个参数(您是否缺少使用指令还是程序集引用?)

请看看并给我建议。


13
最好的选择是添加“ Microsoft.AspNet.WebApi.Client” .Nuget程序包。而已!
萨钦·帕瓦尔

Answers:


435

是的,您需要添加参考

System.Net.Http.Formatting.dll

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

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


7
现在,我得到一个错误:“无法加载文件或程序集'Newtonsoft.Json,版本= 4.5.0.0,文化=中性,PublicKeyToken = 30ad4fe6b2a6aeed'或其依赖项之一。系统找不到指定的文件。”
Jidheesh Rajan

89
发现我必须添加NuGet包“ Microsoft.AspNet.WebApi.Client”以确保格式dll的版本与我项目中的.NET框架版本“ System.Net.Http”一起使用。
Todd H.

27
为什么引用标准系统程序集要求我从Internet上的随机位置下载开放源代码的东西才能使其正常运行?如果无法解决依赖关系,为什么还要编译呢?这让我无休止!
中微子2014年

4
@Neutrino您愿意自己编写代码吗?你应该感到庆幸的是,人们在微软和其他地方已经写代码,你可以免费使用
reggaeguitar

4
PM>安装包System.Net.Http.Formatting.Extension
2016年

193

PostAsJsonAsyncSystem.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


7
这应该是答案。做某事的最好方法就是正确的方法
Alireza

4
到目前为止,这是最好的答案。不要尝试添加NuGet软件包或dll。
格克汗库尔特

3
完全是最好的答案。选择的答案是不是最佳做法,在所有的,其实微软建议不要引用的DLL
Astaar

4
离题,但我还是想提一下:用await FooAsync()代替FooAsync().Result。后者可能会陷入僵局。请参阅stackoverflow.com/q/17248680/2272514及其接受的答案。也有关于细节的良好链接。
Thomas Schreiter '18

2
要使用类型,而不是“应用/ JSON”你可以使用MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/...
daviesdoesit

163

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


1
@Yuval-现在我意识到我建议的“解决方案”听起来像是一条评论。事实证明,Andreo编写了我建议的NuGet软件包。
Todd H.

这就是我的答案!(对我的问题)
JenonD

34

正如已经讨论的那样,自.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)


12

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

症状是上述错误,并在显示为时出现黄色警告三角形 System.Net.Http.Formatting

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


2
有用!要通过Nuget Console进行安装,请输入Install-Package Microsoft.AspNet.WebApi.Client
yu yang Jian

4

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



2

无需编写大量代码即可进行简单的调用,您可以使用Internet上可用的包装器之一。

我已经写了一个叫做WebApiClient的文件,可以在NuGet上找到。

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


@Andreo链接(webapiclient.azurewebsites.net)现在已于2017年11月30日断开。NuGet的工作链接是nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G

不幸的是,微软已经终止了我的azure订阅,并且该网址不再有效:(
Andreo Romera

2

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


0

只需用注释中的提示扩展Jeroen的答案

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

var response = await client.PostAsync("api/AgentCollection", content);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.