c# - 调用 Async WebAPI 后,控制不会返回到等待的 webClient

标签 c# asynchronous asp.net-web-api task-parallel-library swagger

我们有一个 Restful Client-Sever 环境,我正在尝试调试我的代码,其中客户端代码如下所示:

await Client.DoWork(Id);

虽然服务器代码如下所示:

 public virtual async Task<IActionResult> DoWork(long Id)
 {
     return Ok();
 }

请注意,客户端是从 https://github.com/swagger-api/swagger-codegen 代码自动生成的服务的网络客户端。

自动生成的代码永远不会返回的点如下所示:

var response_ = await client_.SendAsync(request_,
    System.Net.Http.HttpCompletionOption.ResponseHeadersRead,
    cancellationToken).ConfigureAwait(false);

这就是控件消失的地方

  • 这里可能有帮助也可能没有帮助的一件事是服务调用是通过代理进行的。不确定这是否会改变什么

当客户端调用 API 时,我可以看到它转到 Return OK() 并且我在 Fiddler 中看到它确实返回了 200OK 但控制永远不会返回到调用方法。我该如何解决这个问题?

最佳答案

您已经发现将 .Wait() 添加到控制台应用程序中的异步方法可以解决问题。这是关于 How Async and Await works 的一个很好的答案.以及答案中提到的文章Async and Await .

When the await operator is passed an incomplete task ... then by default await will capture the current context and return an incomplete task from the method.

所以基本上当客户端开始与服务器方法进行异步通信时返回未完成的任务。并且因为在 Main 方法控制台应用程序中没有等待它在客户端从服务器获得响应之前退出。

控制台应用程序中没有SynchronizationContext,因此可以安全地使用.Wait() 方法或.Result 属性来阻止线程进入Main 方法,直到异步操作完成。

关于c# - 调用 Async WebAPI 后,控制不会返回到等待的 webClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44031524/

相关文章:

c# - 在 WebAPI 中使用 Entity Framework 对表进行 GET 调用时出现异常

c# - Asp.net 用户控制更改文本语言

javascript - 使用 Knockout.js 发布集合

.NET 异步套接字与后台 worker

c# - 在 Monotouch 中下载多个文件的推荐模式(异步/多线程)

json - PUT 到动态 CRM Web API 时出现操作不支持错误

c# - 将 webApi Controller 的 token 身份验证添加到现有的 asp.net MVC 5 应用程序

c# - 确定 DataColumn 是否为数字

c# - C# 中最快和最有效的集合类型

asynchronous - 如何处理 GraphQL Apollo 客户端中的异步突变