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\npublic 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 }\nRun Code Online (Sandbox Code Playgroud)\n\n这是调用代码的示例
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n已回答(大概)
\n\n如果我改变
\n\nHttpResponseMessage response = await httpClient.PostAsync(url, content);\nRun Code Online (Sandbox Code Playgroud)\n\n到
\n\nHttpResponseMessage response = httpClient.PostAsync(url, content).GetAwaiter().GetResult();\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n
请检查您在代码执行路径中进行的所有调用是否都支持异步。例如,有一次我花了相当多的时间弄清楚一个名为 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)
因此,请检查您是否使用了某些不支持异步的调用。
| 归档时间: |
|
| 查看次数: |
3228 次 |
| 最近记录: |