C# MVC 应用程序中本地计算机上的 HTTP 错误 431

问题描述 投票:0回答:2

ajax 将数据发送到我的控制器后,我在视图中的 C# MVC 应用程序中收到 HTTP 错误 431。 这是我视图中的代码:

 $.ajax({
        type: "POST",
        url: "@Url.Action("SaveElectionData")",
        dataType: "text",
        data: { 'formData': sendData },
        success: function (msg) {
            alert("back in view, success");
            $("form").submit();
        },
        error: function (req, status, error) {
            alert("back in view, fail");
            $("form").submit();
        }
 });

当我运行应用程序时,ajax 会将数据发送到我的控制器。 控制器处理数据并将字符串返回给ajax。 我收到警报

back in view, success
。 一旦我单击按钮关闭警报,我就会收到 431 错误。

当我查看开发工具和网络时,我看到的是:

enter image description here

当我点击

Updated
时,我看到的是:

enter image description here

我在运行 Visual Studio 2022 的开发机器(Mac)上运行它,我假设 IIS Express(由 Visual Studio 提供,除非它在 Mac 上与 Windows 机器上不同),并且我刚刚清除了浏览器(chrome) )饼干。 另外,根据第二张图,请求头的内容长度只有182。

这是表单视图中的代码:

@using (Html.BeginForm("Updated", "OnlineEnrollment", FormMethod.Post))
{
}

我的表单中没有任何元素,因为 ajax 已经将数据发送到控制器。

那么为什么我会收到此 431 错误?

有什么想法吗?

编辑1:

这是我的program.cs 文件中的代码,如下所示:

 namespace AccuRecordV3
 {
    public class Program
    {
       public static void Main(string[] args)
       {
           CreateHostBuilder(args).Build().Run();
       }

       public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.ConfigureKestrel((context, options) =>
                {
                    options.Limits.Http2.MaxRequestHeaderFieldSize = 40960;
                });
            });

    }

 }
c# http-headers visual-studio-mac
2个回答
1
投票

如果您查看网络选项卡,您会发现实际上是 Kestrel 返回此 413 响应以及消息“请求标头字段太大”。

您可以在那里配置很多选项,https://learn.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel/options?view=aspnetcore-6.0

MaxRequestHeadersTotalSize
应该成为您需要的人。


0
投票

多种方法可以获取 431 错误,它们适用于任何 Web 技术,而不仅仅是 Asp.Net:

  • 重定向循环
  • 饼干太多或太大
  • 引用网址太长
  • 以上的组合

特别是在 Asp.Net 或 Asp.Net Core 中,默认的 TempData 存储在 cookie 中,因此使用大量 TempData 会使您的 cookie 太大。

选项:

  • 少用 TempData!
  • 使用 SessionStateTempDataProvider 在服务器端会话中存储状态而不是 cookie。
  • 如果您对服务器(可能还有负载均衡器)、您的应用程序部署到有一定的控制权,并且/或者您可以合理地认为大请求不会成为问题,那么我只会使用
    MaxRequestHeadersTotalSize
    设置。
© www.soinside.com 2019 - 2024. All rights reserved.