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
相关产品推荐
相关产品推荐

