ASP.NET 核心 - 如何传递可选的 [FromBody] 参数?

ASP.NET core - how to pass optional [FromBody] parameter?

如何在 ASP.NET Core (5.0) 中传递可选(可为空)[FromBody] 参数?如果我不在请求中发送正文,我会收到 415 Unsupported Media Type 错误。这可以配置吗?如果可以,如何在控制器或操作而不是应用程序级别上进行配置?我认为它必须对模型验证做一些事情,但不确定。谢谢

[HttpGet("[action]")]
public async Task<IActionResult> GetElementsAsync([FromBody] IEnumerable<int> elements = default)
{
  var result = await dataService.GetData(elements);
  return Ok(result);
}

编辑:澄清:

这是典型的场景并且可以正常工作:

但是传递空体是立即返回 415,甚至没有到达动作:

您可以在这里找到解决方案:
https://github.com/pranavkm/OptionalBodyBinding

来自 github 上的这个问题:
https://github.com/dotnet/aspnetcore/issues/6878

从 .net Core 5 开始,您可以使用这个:

public async Task<IActionResult> GetElementsAsync([FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] IEnumerable<int> elements = default)
...

还需要(来自 Pawel 的经验):

services.AddControllers(options =>{options.AllowEmptyInputInBodyModelBinding = true;})

只需在您的请求 header 中添加 content-type。没有 content-type:application/json 当 body 为空时会出现 415

您的控制器没有任何变化。我这边测试没问题

我创建了一个新的 asp.net core 5 api 项目,这是我的控制器:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;

namespace WebApi_net5.Controllers
{
    public class HomeController : ControllerBase
    {
        [HttpGet("[action]")]
        public string GetElementsAsync([FromBody] IEnumerable<int> elements = default)
        {
            return "value";
        }
    }
}

使用 ASP.NET Core 3.1,我可以通过实施 Nicola 的建议允许 nullable 可选 参数:

services.AddControllers(options =>{options.AllowEmptyInputInBodyModelBinding = true;})