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

.Net 5.0中如何将HTTP请求Body读取为字符串

问题原因

你现有代码会得到null是因为ASP.NET Core默认的[FromBody]模型绑定逻辑会尝试将请求体的JSON内容反序列化为目标类型string,当JSON格式不合法时反序列化失败,绑定器就会给参数赋值为null。

实现方案

方案1:单接口直接读取请求体(推荐,对其他接口无影响)

不需要使用模型绑定,直接从当前请求的Body流中读取原始内容,代码如下:

[HttpPost]
[Route("api")]
public async Task<string> Api()
{
    // 启用请求体缓冲,支持多次读取
    Request.EnableBuffering();
    // 读取请求体内容,leaveOpen设为true避免读取完成后关闭流
    using var streamReader = new StreamReader(Request.Body, System.Text.Encoding.UTF8, leaveOpen: true);
    string requestContent = await streamReader.ReadToEndAsync();
    // 重置流位置,保证后续中间件可以正常读取请求体
    Request.Body.Position = 0;

    // 后续可自行尝试解析JSON,解析失败也不会丢失原始请求内容
    return requestContent;
}

方案2:全局配置移除JSON输入格式化器(适合所有接口都需要原始请求体的场景)

如果你的服务所有POST接口都不需要默认的JSON反序列化逻辑,直接要原始请求体,可以在服务注册时移除默认的JSON输入格式化器,之后[FromBody] string就可以直接拿到原始请求串,无需修改接口代码:

// Startup.cs的ConfigureServices方法中
services.AddControllers(options =>
{
    options.InputFormatters.RemoveType<Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter>();
});

注意事项

  • 请求体流默认是只可读一次的,必须调用Request.EnableBuffering()才能支持多次读取,否则后续的认证、日志等中间件无法获取请求体会抛出异常。
  • 读取完成后必须将Request.Body.Position重置为0,否则后续流程读到的流内容为空。

内容的提问来源于stack exchange,提问作者Engin Altuntaş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:24:01