ASP.NET Core Web API(非MVC)如何将同步POST创建接口改造为async异步方法
ASP.NET Core Web API POST接口异步改造
问题根因
仅在控制器上添加async关键字无法完成异步改造:现有服务层调用的是MongoDB驱动的同步API(同步查询、同步插入),本身不返回可等待的异步任务,强行标注async会直接触发编译错误,运行时也会出现阻塞。
服务层替换代码
将原有同步数据操作替换为MongoDB驱动内置的原生异步方法,业务判断逻辑完全保留:
public async Task<Message> DuplicateMessage(string text) { return await _messages.Find<Message>(message => message.Text == text) .FirstOrDefaultAsync(); } public async Task Create(Message message) { await _messages.InsertOneAsync(message); }
控制器改造后代码
调整方法返回值为Task<ActionResult<Message>>,所有异步方法调用添加await,原有路由、返回规则、校验逻辑不做改动:
[HttpPost] public async Task<ActionResult<Message>> Create(Message message) { var duplicatemessage = await _messageService.DuplicateMessage(message.Text); if (duplicatemessage == null) { await _messageService.Create(message); return CreatedAtRoute("Api", new { id = message.Id.ToString() }, message); } else { return BadRequest(new { message = "Text Already Exist" }); } }
关键注意点
- 异步链路中绝对禁止使用
.Result、.Wait()阻塞获取任务结果,会引发请求死锁、线程池耗尽问题 - 异步改造不改变接口对外的HTTP行为、返回结构,仅优化数据库IO等待阶段的线程利用率
- 若编译提示找不到
FirstOrDefaultAsync、InsertOneAsync方法,需将MongoDB.Driver包升级到3.0以上版本
内容的提问来源于stack exchange,提问作者Nirdha
相关产品推荐
相关产品推荐

