【问题标题】:DotNet Core app doesn't accept POST on LinuxDotNet Core 应用程序不接受 Linux 上的 POST
【发布时间】:2018-02-12 17:27:46
【问题描述】:

这是我的第一个 DotNetCore 2.0 应用程序,我想用它来比较 IIS/Windows 和 nginx/Ubuntu 之间的性能。它是一个与多个服务(mongo/redis/session state)对话以创建虚假但真实的用户旅程的应用程序。

当我从 Visual Studio 调试或从 PostMan 调用时,应用程序在 Windows 上运行得非常好,但如果我部署到 Ubuntu,尽管我可以访问网站的首页和下一页(都是 GET),尽快当我在第二页(只有一个字段)上发布表单时,它从浏览器和邮递员失败,显示 400 但没有详细信息。 Ubuntu 没有记录除了 Web 服务器启动之外的任何内容,尽管它之前记录了错误,因此记录工作正常。

我什至尝试了IgnoreAntiforgeryToken 的操作,但没有帮助。

相关配置:

public void ConfigureServices(IServiceCollection services)
{
    if (Configuration.GetValue<bool>("useFileSystem"))
    {
        services.AddDataProtection()
            .PersistKeysToFileSystem(new DirectoryInfo(Configuration.GetValue<string>("fileSystemPersistPath")))
            .SetApplicationName("Perftest2018");
    }
    else
    {
        services.AddDataProtection()
            .SetApplicationName("Perftest2018");
    }

    services.AddMvc();
    services.AddDistributedMemoryCache();
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromSeconds(30);
        options.Cookie.HttpOnly = true;
    });

    services.Configure<IISOptions>(options =>
    {
        options.AutomaticAuthentication = false;
    });

    //<snip> the rest of my services
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseDeveloperExceptionPage();
    app.UseStaticFiles();
    app.UseSession();

    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");
    });
}

动作是这样的:

[HttpPost]
public async Task<IActionResult> Authorize(AuthorizeViewModel model)
{
    // The view model just has a single string property with no other attributes
}

【问题讨论】:

  • 400 表示错误请求,即您提出的请求错误。你确定nginx 没有直接拒绝吗?
  • 因为之前应用程序抛出时,它在我的错误日志中记录了错误?它会抛出并杀死日志输出吗?可能,但这并不能解释为什么它不起作用。 nginx 没有拒绝它,它是 dotnetcore 的代理,其他页面都在工作。
  • 看另一个问题,是否可能与通过 HTTP 而不是 HTTPS 在某处阻止 POST 有关?我可以看到如何启用它,但不是默认情况下在任何地方启用它。
  • 您是否缺少 POST 方法中的 [FromBody] 装饰器?

标签: ubuntu nginx asp.net-core asp.net-core-2.0


【解决方案1】:

这是由代理中的其他 nginx 标头引起的,这些标头取自另一个运行 TLS 的服务器。标题 Upgrade $http_upgradeConnection "upgrade" 大概不允许 POST!

【讨论】:

  • thx Lukos 我也遇到了这个问题,就像你怀疑 nginx 应该受到指责,因为它在 Windows 上运行良好,并且记录请求表明它从未到达控制器。我猜这些额外的标头会导致 kestrel 假发 - 似乎只有当您要使用 websockets 时才需要这些标头,请参阅nginx.org/en/docs/http/websocket.html
  • 在阅读dotnet core docs 之后,似乎Connection "upgrade" 是原因
猜你喜欢
  • 2021-07-19
  • 2017-04-14
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多