AJAX 亚马逊 ASP.NET 核心应用的请求失败 Linux 2 vs 亚马逊 Linux 1

AJAX requests failing for ASP.NET Core app in Amazon Linux 2 vs Amazon Linux 1

我有一个 ASP.NET Core v.3.0 Web 应用程序托管在 Amazon AWS Elastic Beanstalk 中,使用 Docker。该应用程序在 Docker 运行 64 位亚马逊 Linux (v2.16.11) 中运行良好。当我更新到 Docker 运行 64 位亚马逊 Linux 2 (v3.4.12) 时,请求工作正常,但 AJAX 请求失败并显示状态代码错误 400“错误请求” .源代码、dockerfile 等没有其他变化。只有 Linux 版本从 Amazon Linux 更改为 Amazon Linux 2. 有没有人知道 Amazon [=] 之间有什么不同64=] 1 和 Amazon Linux 2 这可能是导致 AJAX 请求失败的原因?

更多信息:

  1. 我无法用官方 ASP.NET 核心 3.1 示例复制此错误。我还没有更新我的应用程序到 v3.1,我会尽快更新这个问题。
  2. 控制器内部的相关操作不会return Amazon 中的部分视图Linux 2. 控制器在returning 部分视图之前提供了一个日志,这不是在亚马逊触发 Linux 2.
  3. nginx access.log 文件显示负载均衡器的以下响应:

亚马逊 Linux 1: {IP} - - [10/Apr/2022:07:36:01 +0000] "POST {url} HTTP/1.1" 200 3882 "{url2}" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36" "{IP2}"

亚马逊 Linux 2: {IP} - - [10/Apr/2022:07:00:14 +0000] "POST {url} HTTP/1.1" 400 0 "{url2}" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36" "{IP2}"

  1. 调用是用jQuery 3.4.1:

    var $form = $("#inputForm");
    if ($form.length <= 0) return;
    var data = $form.serialize();
    $.ajax({
        url: "...",
        type: "POST",
        data: data,
        error: function (jqXHR, textStatus, errorThrown) {
            alert("There was an error when loading the results (error type = " + errorThrown + ").");
        },
        success: function (result) {
            $("#calculationTarget").html(result)
        });
    

如果将项目从 ASP.NET Core 3.0 更新到 ASP.NET Core 3.1,则问题不再存在。

有一个非常简单的修复,正在更新到 ASP.NET Core 3.1

在此版本中,您遇到的问题已得到修复。


请参阅以下更新步骤。

  1. 如果您有 global.json 文件以特定 .NET Core SDK 版本为目标,请更新版本 属性。

    {
      "sdk": {
        "version": "3.1.101"
      }
    }
    
  2. 将 TFM 更新为 netcoreapp3.1,如下所述。

    <Project Sdk="Microsoft.NET.Sdk.Web">
      <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
      </PropertyGroup>
    </Project>
    
  3. 您需要更新包引用。为此,请将每个 Microsoft.AspNetCore.** 表示通配符)更新为 3.1.0(或任何更高版本)。

  4. 如果您正在使用 Docker(我认为您是),那么您需要使用 ASP.NET Core 3.1 基础图像。请参阅下面的示例。

    $ docker pull mcr.microsoft.com/dotnet/aspnet:3.1
    

有关额外的步骤和信息,请参阅 the official guide from migrating to ASP.NET Core 3.1


总而言之,将您当前的应用程序升级到 ASP.NET Core 3.1 应该可以解决您的问题。