HttpClient-PostAsync不返回

时间:2019-12-12 21:31:45

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

有人知道为什么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);

2 个答案:

答案 0 :(得分:2)

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

因此,请检查您是否正在使用某些不支持异步的呼叫。

答案 1 :(得分:-1)

像这样尝试ConfigureAwait

HttpResponseMessage response = await httpClient.PostAsync(url, content).ConfigureAwait(false);