Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HttpClient不支持同步方法C#_C#_Json_Asp.net Web Api_Dotnet Httpclient - Fatal编程技术网

HttpClient不支持同步方法C#

HttpClient不支持同步方法C#,c#,json,asp.net-web-api,dotnet-httpclient,C#,Json,Asp.net Web Api,Dotnet Httpclient,我正在尝试从我的web应用程序调用web API。我正在使用.Net 4.5,在编写代码时,我发现错误HttpClient不包含定义PostAsJsonAsync方法 代码如下: HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:51093/"); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQual

我正在尝试从我的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”(是否缺少 使用指令或组件引用?)


请查看并给我建议。

是的,您需要添加对的引用

System.Net.Http.Formatting.dll
这可以在扩展程序集区域中找到


实现这一点的一个好方法是将添加到项目中。

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

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

我写了一个叫做WebApiClient的,可以在NuGet上找到。。。看看


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

或者,您可以将
PostAsJsonAsync
替换为
postassync
调用,这只是新dll的一部分。 替换

与:

请注意,
JavaScriptSerializer
位于命名空间中:
System.Web.Script.Serialization

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


请看

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

,正如已经讨论过的那样,自.NET 4.5.2以来,此方法不再可用。要展开,可以创建扩展方法:

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);
}
公共静态异步任务PostAsJsonAsync(此HttpClient客户端,字符串请求URL,TModel模型)
{
var serializer=新的JavaScriptSerializer();
var json=serializer.Serialize(模型);
var stringContent=newstringcontent(json,Encoding.UTF8,“application/json”);
return wait client.PostAsync(requestUrl,stringContent);
}

现在您可以调用
client.postsjsonasync(“api/AgentCollection,user)”
我在一个刚从源代码管理签出的项目上也遇到了这个问题

症状是上述错误和对
System.Net.Http.Formatting


为了修复此问题,我删除了断开的引用,然后使用NuGet安装最新版本的Microsoft.AspNet.WebApi.Client

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

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


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


如果您真的需要找出哪个API驻留在哪里,如果您已经在使用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。看看这里

现在我得到一个错误:“无法加载文件或程序集'Newtonsoft.Json,Version=4.5.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6eed'或其依赖项之一。系统找不到指定的文件。”发现时,我必须添加NuGet包“Microsoft.AspNet.WebApi.Client”确保格式化dll的版本与我的项目中的.NET framework版本的“System.NET.Http”配合使用。为什么引用标准系统程序集需要我从Internet上的任意位置下载开源内容才能使其正常工作?如果它不能解析依赖项,为什么还要编译呢?这让我烦透了@中微子你愿意自己写代码吗?您应该感谢微软和其他地方的人编写了代码,可以用于freePM>Install Package System.Net.Http.Formatting。Extension@Yuval-我现在意识到,我提出的“解决方案”听起来像是一个评论。原来是Andreo编写了我建议的NuGet软件包。这就是我的答案!(对我的问题)这应该是答案。做某事的最好方法是正确的方法这是迄今为止最好的答案。不要尝试添加NuGet包或DLL。这完全是最好的答案。选择的答案根本不是最佳实践,事实上Microsoft建议不要引用DLLsOff主题,但我还是想提一提:使用
wait fooancy()
而不是
fooancy()。Result
。后者可能会死锁。见及其公认的答案。还有关于详细信息的好链接。要使用类型而不是“application/json”,可以使用MediaTypeNames.application.json,最好的选择是添加“Microsoft.AspNet.WebApi.Client”.Nuget包。就这样!链接()现已于2017年11月30日断开。NuGet working链接很遗憾,Microsoft已结束我的azure订阅,url不再有效:(
HttpClient
System.Net.Http.HttpClient
  // 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"));