.NET Core 2.0 Web App在Dokku(DigitalOcean)上POST请求返回400排查求助
看起来你遇到的这个问题确实挺棘手的——带参数的POST请求直接返回400,还没进入控制器方法,连日志都没记录。我来给你梳理几个排查方向,一步步来定位问题:
1. 先确认前端请求的参数格式是否匹配后端绑定规则
你的POST方法是public IActionResult Index(string model),ASP.NET Core默认会从表单数据(application/x-www-form-urlencoded)里找名为model的参数。你可以打开浏览器开发者工具的Network标签,触发测试请求后查看:
- 请求的Content-Type是不是
application/x-www-form-urlencoded? - Form Data里有没有
model=你输入的内容这个键值对?
如果是用AJAX发送JSON,那你需要给参数加上[FromBody]特性:
[HttpPost] [IgnoreAntiforgeryToken] public IActionResult Index([FromBody] string model) { return View(); }
同时前端要设置Content-Type: application/json,并且请求体是"你的输入内容"(注意是字符串直接包裹,不是键值对)。
2. 检查Dokku的Nginx反向代理配置
Dokku默认用Nginx处理请求转发,有可能是Nginx的配置拦截了POST请求或者限制了请求体。你可以登录到你的Droplet,执行以下操作:
- 查看应用的Nginx配置文件:
cat /home/dokku/你的应用名/nginx.conf,重点看client_max_body_size(如果请求体超过这个值会返回400),还有是否有奇怪的rewrite规则。 - 查看Nginx的错误日志:
tail -f /var/log/nginx/error.log,触发请求后看看有没有相关报错。 - 查看Dokku应用的日志:
dokku logs 你的应用名 -t,实时监控日志输出。
3. 调整ASP.NET Core的日志级别,捕获更多细节
你说服务器端无日志记录,大概率是日志级别不够高。修改你的appsettings.json,把日志级别调到Debug:
{ "Logging": { "LogLevel": { "Default": "Debug", "System": "Debug", "Microsoft": "Debug" } } }
重新部署应用后,再发送POST请求,用dokku logs 你的应用名查看日志,应该能看到请求到达后的处理流程,比如模型绑定失败的详细信息。
4. 用curl/Postman发送最简请求测试
绕过前端页面,直接用工具发送POST请求,排除前端代码的问题:
# 模拟表单提交 curl -X POST http://206.189.55.62/ -d "model=test" # 模拟JSON请求(如果用[FromBody]的话) curl -X POST http://206.189.55.62/ -H "Content-Type: application/json" -d "\"test\""
看看返回的400错误有没有响应体,ASP.NET Core通常会在400响应里返回具体的错误原因(比如模型绑定失败)。
5. 检查Dockerfile的潜在问题
你的Dockerfile里用了microsoft/dotnet:2.0-sdk作为runtime镜像,其实更合适的是用专门的ASP.NET Core runtime镜像:microsoft/dotnet:2.0-aspnetcore-runtime,虽然这不一定是400错误的直接原因,但可以避免不必要的依赖问题。另外,确认容器内部是否正确监听80端口,你设置的ASPNETCORE_URLS http://*:80是没问题的。
6. 排除Dokku插件或环境的干扰
试试在本地用Docker运行你的镜像,测试POST请求是否正常:
# 本地构建镜像 docker build -t myapp . # 运行容器 docker run -p 8080:80 myapp
然后在本地访问http://localhost:8080测试POST请求,如果本地正常,那问题大概率出在Dokku的配置或插件上,可以尝试禁用一些非必要的Dokku插件(比如防火墙、认证类插件)再测试。
内容的提问来源于stack exchange,提问作者Murat

