【问题标题】:cannot convert void to an object in asp.netcore无法将 void 转换为 asp.net 核心中的对象
【发布时间】:2021-06-30 16:52:13
【问题描述】:

我在 asp.net 核心中编写了一个 api 端点,并且出现错误无法将 void 转换为对象 我遇到错误。我理解的是 SendEmailReminder 方法返回 void 但我如何在控制器中处理它。如果我删除等待,错误就会消失,但我会收到该方法将同步执行的警告。有人可以帮忙吗

return Ok(await _counterpartyProposalService.SendEmailReminder());

控制器

 [HttpPost]
 [Route("sendEmailReminder")]
 public async Task<IActionResult> SendEmailReminders()
 {
    return Ok(await _counterpartyProposalService.SendEmailReminder());
 }



  public async Task SendEmailReminder()
  {
     var stepCode = StepCodes.BasicInformation;
     var command = _commandResolver(stepCode, null);
     await command.ExecuteEmailReminder();
  }

【问题讨论】:

  • await _counterpartyProposalService.SendEmailReminder(); return Ok()?为什么要把事情复杂化?
  • 您的SendEmailReminder 函数返回一个无类型的任务。一旦你await 它,就没有返回类型。 Task 在概念上等同于 Task&lt;void&gt;。当您调用Ok 时,它期望有一个参数 - 任何参数。你没有。我相信您可以通过await 拨打SendEmailReminder 逃脱,一旦完成,只需拨打Ok()

标签: c# asp.net-core


【解决方案1】:

假设您的 HTTP 调用没有返回任何内容,您可以通过以下方式重构代码。通过这样做,您将返回 HTTP 204。

 [HttpPost]
 [Route("sendEmailReminder")]
 public async Task<IActionResult> SendEmailReminders()
 {
    await _counterpartyProposalService.SendEmailReminder();
    NoContent();
 }

  public async Task SendEmailReminder()
  {
     var stepCode = StepCodes.BasicInformation;
     var command = _commandResolver(stepCode, null);
     await command.ExecuteEmailReminder();
  }

这是Ok方法的签名:

public virtual OkObjectResult Ok([ActionResultObjectValue] object value)

删除await 关键字时未收到错误的原因是OkTask 对象作为输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多