ASP.NET Core如何设置可选[FromBody]参数解决空请求体报415错误问题
问题原因
你遇到的415错误并非模型验证导致,本质是ASP.NET Core默认的输入格式化规则限制:只要Action声明了[FromBody]参数,框架就要求请求必须携带对应Content-Type的请求体。空请求体不存在Content-Type头,无法匹配到对应的输入格式化器,因此会在中间件阶段直接返回415,请求不会进入Action执行。
额外提示:HTTP规范不推荐GET请求携带请求体,部分网关、反向代理会直接丢弃GET请求的Body,无特殊需求建议将请求方法改为[HttpPost]适配性更好。
控制器/Action层面解决方案(无需全局配置)
通过自定义Action约定特性,可以仅对标记的控制器或Action开放空请求体权限,步骤如下:
- 自定义可选Body特性
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.ModelBinding; public class OptionalBodyAttribute : Attribute, IActionModelConvention { public void Apply(ActionModel action) { // 匹配当前Action下的FromBody参数 var bodyParam = action.Parameters.FirstOrDefault(p => p.BindingInfo?.BindingSource == BindingSource.Body); if (bodyParam != null) { // 允许该参数接收空请求体 bodyParam.BindingInfo.EmptyBodyIsAllowed = true; } } }
- 把特性贴到需要的Action/控制器上即可
[HttpGet("[action]")] [OptionalBody] // 仅对当前Action生效,贴到控制器类上则对该控制器所有Action生效 public async Task<IActionResult> GetElementsAsync([FromBody] IEnumerable<int> elements = default) { // 空请求体场景下elements会为null,可自行处理默认逻辑 elements ??= Enumerable.Empty<int>(); var result = await dataService.GetData(elements); return Ok(result); }
全局配置方案(可选)
如果需要全局允许所有[FromBody]参数接收空请求体,可在程序启动配置中添加如下规则:
// .NET 5 Startup.cs 配置方式 services.AddControllers(options => { options.AllowEmptyInputInBodyModelBinding = true; });
内容的提问来源于stack exchange,提问作者Pawel
相关产品推荐
相关产品推荐

