Nginx asp net core 3在发布后对带有正文内容的POST操作获取错误请求响应

Nginx asp net core 3在发布后对带有正文内容的POST操作获取错误请求响应,nginx,asp.net-core,asp.net-core-3.0,Nginx,Asp.net Core,Asp.net Core 3.0,我正在用asp.NETCore3构建一个网站,我将它托管在Debian9服务器上,使用nginx作为反向代理。我遇到的问题是,当我在visual studio中本地运行应用程序时,我的POST请求确实有效,但当我发布应用程序并将其上载到服务器时,它们突然不再有效 这是我用于测试的控制器: public class TestController : Controller { [HttpPost] public IActionResult Ping() { r

我正在用asp.NETCore3构建一个网站,我将它托管在Debian9服务器上,使用nginx作为反向代理。我遇到的问题是,当我在visual studio中本地运行应用程序时,我的POST请求确实有效,但当我发布应用程序并将其上载到服务器时,它们突然不再有效

这是我用于测试的控制器:

public class TestController : Controller
{
    [HttpPost]
    public IActionResult Ping()
    {
        return Ok();
    }

    [HttpPost]
    public IActionResult Echo(string message)
    {
        return Ok(message);
    }

    [HttpPost]
    public IActionResult FormEcho([FromForm]string message)
    {
        return Ok(message);
    }
}
我正在使用postman测试这些端点

Ping

  • 使用不带任何参数的post请求,在本地和服务器上都会得到预期的200
  • 使用带有x-www-form-urlencoded内容的post请求在本地给出200,但在服务器上给出400
Echo

  • 带有查询字符串参数的Post请求在本地和服务器上返回代码为200的消息
  • 消息为x-www-form-urlencoded content的Post请求在本地返回代码为200的消息,但在服务器上返回400
FormEcho

  • 消息为x-www-form-urlencoded content的Post请求在本地返回代码为200的消息,但在服务器上返回400
从这个测试中,我认为在我的服务器上以某种方式拒绝了包含正文内容的post请求。我还从日志中注意到,对于服务器上返回400的请求,日志中没有任何内容,好像请求甚至没有到达我的应用程序

为什么我的应用程序拒绝包含正文内容的post请求?


编辑:
以下是我在nginx中的配置:

server {
    listen        443 ssl;
    listen        [::]:443 ssl;

    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

    server_name   51.38.35.10;

    error_log /var/log/nginx/error.log info;

    location / {
        proxy_pass         http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection 'upgrade';
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

server {
    listen        80;
    listen        [::]:80;

    server_name   51.38.35.10;

    return 302 https://$server_name$request_uri;
}

如果ASP.NET核心应用程序甚至不记录传入请求(而其他应用程序在工作),那么它似乎实际上没有收到任何传入请求。在这种情况下,可能是您的反向代理配置不允许这些请求通过您的应用程序

我通常通过nginx为ASP.NET核心应用程序使用以下配置:

location / {
    proxy_pass         http://localhost:5000;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection keep-alive;
    proxy_set_header   Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
}
这也是问题所在

设置不同的
连接
头值,尤其是
升级
,似乎有点问题。我个人刚刚看到了与WebSocket的HTTP
Upgrade
头一起使用时的
Upgrade

因此,调整nginx配置可能会解决您的问题


请注意,
连接保持活动状态

“日志中没有任何内容,好像请求甚至没有到达我的应用程序”——那么可能没有?检查nginx的日志,查看是否有任何问题。您还可以尝试直接在服务器上运行应用程序(不使用nginx),看看它是否可以这样工作。还可以尝试增加日志级别,以便查看调试消息。如果ASP服务器上没有关于请求的日志,但nginx服务器中有日志,则问题在于您的配置。您应该发布配置,以及nginx中的所有错误日志。另外,nginx可以在调试模式下启动,在调试模式下,它可以生成更多有用的日志。@SebastianRedl感谢您的建议。我在问题中包括了我的nginx配置。我检查了日志,没有关于400个错误的消息。我将日志级别设置为info,因为我了解到在info级别记录了400个错误,但没有消息。只有关于我的自签名证书的警告。我会看看是否可以在调试模式下启动nginx。@谢谢,我会尝试在没有nginx的情况下运行应用程序,看看会发生什么。不知道这是否与此问题有关,但我只看到了
连接“升级”
与websocket配置有关。请尝试代理设置头连接保持活动状态。