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

C# .NET Core API在Linux下POST JSON请求体为空问题排查

解决Linux+Nginx反向代理Kestrel时Request.Body读取为空的问题

看起来你遇到的问题是在Nginx反向代理Kestrel的场景下,无法正确读取POST请求的请求体,而本地调试和IIS环境下都正常。这个问题通常和Nginx的代理配置或者请求流的处理方式有关,下面给你几个针对性的解决方案:

1. 检查并修正Nginx反向代理配置

Nginx默认会缓冲请求体,这可能导致Kestrel无法正确获取到请求内容。你需要在Nginx的location配置块中添加相关指令,确保请求体被正确传递:

location /TelegramWebHook {
    proxy_pass http://localhost:5000; # 替换成你的Kestrel服务地址
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 关键配置:关闭请求体缓冲
    proxy_buffering off;
    proxy_request_buffering off;
}

修改配置后,记得重启Nginx服务生效:sudo systemctl restart nginx

2. 重置Request.Body的读取位置并使用异步读取

在.NET Core中,Request.Body是一个可seek的流,但如果有其他中间件提前读取过流,会导致流的Position不在起始位置,从而读取到空内容。你可以在读取前重置流的位置,同时建议使用异步方法提升性能:

[HttpPost("TelegramWebHook")]
public async Task<IActionResult> TelegramWebHook()
{
    // 将流的位置重置到开头,确保能读取到完整内容
    Request.Body.Position = 0;
    using (StreamReader reader = new StreamReader(Request.Body))
    {
        var output = await reader.ReadToEndAsync();
        return Ok(output);
    }
}

3. 确认Kestrel的请求体大小限制

如果你的Telegram WebHook请求体较大,Kestrel的默认请求体大小限制可能会截断内容。可以在Program.cs中调整Kestrel的配置:

var builder = WebApplication.CreateBuilder(args);

// 配置Kestrel允许更大的请求体
builder.WebHost.ConfigureKestrel(options =>
{
    // 设置为null表示不限制,或者指定具体大小(比如10MB:10 * 1024 * 1024)
    options.Limits.MaxRequestBodySize = null;
});

// 其他配置...
var app = builder.Build();

按照上面的步骤逐一排查,应该能解决你遇到的问题。

内容的提问来源于stack exchange,提问作者user1018379

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:49:35