首页 > 解决方案 > HttpClient - PostAsync 不返回

问题描述

有谁知道为什么 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 上核心 3 的一个怪癖。我不喜欢这种情况发生。

更多信息

我正在做很多循环。

似乎如果我把我正在等待的所有东西都放在一个 taskList 中,它就会正常运行。

\\ Pseudo Code
var taskList = new List<Task>();

foreach(var thing in things){
  taskList.Add(HttpHelpers.PostAsync(...things));
}

await Task.WhenAll(taskList);

标签: c#exception.net-coreasync-awaitmicrosoft-graph-api

解决方案


请检查您在代码执行路径中进行的所有调用是否都支持异步。例如,有一次我花了很长时间弄清楚一个名为 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; 
                    } 
}

所以请检查你没有使用一些不支持异步的调用。


推荐阅读