有谁知道为什么 HttpClient - PostAsync 不返回。它只是什么都不做。我偶尔会让它工作,特别是对于一次性帖子,但有时似乎不做任何事情,特别是在负载下,并且它不会抛出异常,这当然会使我的代码不可靠且难以调试。
我尝试添加ConfigureAwait(false),这没有什么区别。
我怀疑任务未能“打包”
这是使用 Visual Studio 代码在 macOS Catalina 上运行的核心 3.0 控制台应用程序
此代码几乎是从 Microsoft 文档中复制的,我在发布时调用 Microsoft Graph。
public static async Task PostAsync(HttpClient httpClient, string url, string token, HttpContent content, Action<JObject> processResult, ILogger log)
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
// content.Headers.Clear();
content.Headers.Add("Content-Type", "application/json");
try
{
HttpResponseMessage response = await httpClient.PostAsync(url, content);
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject(json) as JObject;
processResult(result);
}
else
{
var errorContent = await response.Content.ReadAsStringAsync();
log.LogError(errorContent);
}
}
catch (System.Exception ex)
{
log.LogError(ex, ex.Message);
throw;
}
}
这是调用代码的示例
public async Task SendInvitation(string token, Invitation invitation, ILogger logger)
{
var stringContent = new StringContent(JsonConvert.SerializeObject(invitation), Encoding.UTF8, "application/json");
await HttpHelpers.PostAsync(
Client,
"https://graph.microsoft.com/v1.0/invitations",
token,
stringContent,
result => logger.LogInformation(DebugHelpers.Print(result)),
logger);
}
已回答(某种程度上)
如果我改变
HttpResponseMessage response = await httpClient.PostAsync(url, content);
至
HttpResponseMessage response = httpClient.PostAsync(url, content).GetAwaiter().GetResult();
它似乎可以工作,但速度很慢,因为我正在做的是使用阻塞代码。我认为这是 macOS 上 core 3 的一个怪癖。我不喜欢这种情况发生。
更多信息
我做了很多循环。
看来,如果我将所有正在等待的事情放入任务列表中,它的行为就会正常。
\\ Pseudo Code
var taskList = new List<Task>();
foreach(var thing in things){
taskList.Add(HttpHelpers.PostAsync(...things));
}
await Task.WhenAll(taskList);
最佳答案
请检查您在代码执行路径中进行的所有调用是否都支持异步。例如,有一次我花了相当多的时间弄清楚一个名为 CommandLineParser 的 nuget 包不支持异步调用。我是这样使用的:
public static void Main(string[] args)
{
Parser.Default.ParseArguments<Options>(args)
.WithParsed(async options =>
{ await httphelper.PostAsync(...);
}
}
我通过将其更改为类似的内容来解决该问题
public static void Main(string[] args)
{
Parser.Default.ParseArguments<Options>(args)
.WithParsed(options =>
{ httphelper.PostAsync(...).Result;
}
}
因此,请检查您是否使用了某些不支持异步的调用。
关于c# - HttpClient - PostAsync 不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59313010/