HttpClient - PostAsync 不返回

Pet*_*ter 2 c# exception async-await .net-core microsoft-graph-api

有谁知道为什么 HttpClient - PostAsync 不返回\xe2\x80\x99t。它只是什么都不做。我偶尔会让它工作,特别是对于一次性帖子,但有时似乎不做任何事情,特别是在负载下,并且它不会抛出异常,这当然会使我的代码不可靠且难以调试。

\n\n

我尝试添加ConfigureAwait(false) 这没有什么区别。

\n\n

我怀疑任务未能“打包”

\n\n

这是使用 Visual Studio Code 在 macOS Catalina 上运行的核心 3.0 控制台应用程序

\n\n

这段代码几乎是从 Microsoft 的文档中复制的,并且我在发布时调用了 Microsoft Graph。

\n\n
public static async Task PostAsync(HttpClient httpClient, string url, string token, HttpContent content, Action<JObject> processResult, ILogger log)\n    {\n        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);\n        // content.Headers.Clear();\n        content.Headers.Add("Content-Type", "application/json");\n        try\n        {\n            HttpResponseMessage response = await httpClient.PostAsync(url, content);\n            if (response.IsSuccessStatusCode)\n            {\n                var json = await response.Content.ReadAsStringAsync();\n                var result = JsonConvert.DeserializeObject(json) as JObject;\n                processResult(result);\n            }\n            else\n            {\n                var errorContent = await response.Content.ReadAsStringAsync();\n                log.LogError(errorContent);\n            }\n        }\n        catch (System.Exception ex)\n        {\n            log.LogError(ex, ex.Message);\n            throw;\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是调用代码的示例

\n\n
public async Task SendInvitation(string token, Invitation invitation, ILogger logger)\n{\n    var stringContent = new StringContent(JsonConvert.SerializeObject(invitation), Encoding.UTF8, "application/json");\n    await HttpHelpers.PostAsync(\n        Client,\n        "https://graph.microsoft.com/v1.0/invitations",\n        token,\n        stringContent,\n        result => logger.LogInformation(DebugHelpers.Print(result)),\n        logger);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

已回答(大概)

\n\n

如果我改变

\n\n
HttpResponseMessage response = await httpClient.PostAsync(url, content);\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
HttpResponseMessage response = httpClient.PostAsync(url, content).GetAwaiter().GetResult();\n
Run Code Online (Sandbox Code Playgroud)\n\n

它似乎有效,但速度很慢,因为我正在做的是使用阻塞代码。我认为这是 macOS 上 core 3 的一个怪癖。我不喜欢这样的事情发生。

\n\n

更多信息

\n\n

我正在做很多循环。

\n\n

看来,如果我将所有正在等待的事情放入任务列表中,它的行为就会正常。

\n\n
\\\\ Pseudo Code\nvar taskList = new List<Task>();\n\nforeach(var thing in things){\n  taskList.Add(HttpHelpers.PostAsync(...things));\n}\n\nawait Task.WhenAll(taskList);\n\n
Run Code Online (Sandbox Code Playgroud)\n

tub*_*aya 5

请检查您在代码执行路径中进行的所有调用是否都支持异步。例如,有一次我花了相当多的时间弄清楚一个名为 CommandLineParser 的 nuget 包不支持异步调用。我是这样使用它的:

public static void Main(string[] args) 
{
     Parser.Default.ParseArguments<Options>(args) 
                   .WithParsed(async options => 
                    { await httphelper.PostAsync(...); 
                    } 
}
Run Code Online (Sandbox Code Playgroud)

我通过将其更改为类似的内容来解决这个问题

public static void Main(string[] args) 
{
     Parser.Default.ParseArguments<Options>(args) 
                   .WithParsed(options => 
                    { httphelper.PostAsync(...).Result; 
                    } 
}
Run Code Online (Sandbox Code Playgroud)

因此,请检查您是否使用了某些不支持异步的调用。