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;})
如何在 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;})