You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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开放空请求体权限,步骤如下:

  1. 自定义可选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;
        }
    }
}
  1. 把特性贴到需要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:48:03