c# - HttpClient - PostAsync 不返回

标签 c# exception .net-core async-await microsoft-graph-api

有谁知道为什么 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/

相关文章:

.net-core - Azure 数据工厂 v2 使用执行管道事件中的表达式动态设置管道名称

c# - 如何在右键单击时获取数据网格列索引? MVVM WPF

c# - 配置 filesystemwatcher 使其仅在文件被完全复制时引发创建的事件

c++ - 触发异常时应该如何记录?

php - 安装 AjaXplorer 时出错

java - 如何使用文本文件中的 PrinterWriter 类获得以下结果?

c# - 以英语语言环境显示所有异常

C# 放在哪里查看具体信息?

dotnet-cli - Ubuntu dotnet 用户 secret

javascript - Cookie 不随 CORS Web 请求一起发送