【问题标题】:413 request entity too large - Web API413 请求实体太大 - Web API
【发布时间】:2020-05-04 11:15:04
【问题描述】:

我在尝试将数据从我的 Web 应用程序 (.netfx 4.6.1) 发送到我的 Web api (.net core 3.1) 时遇到了 413 问题。在下面的代码中,我发送了一个列表,其中包含图像的字节数据以及构建文件所需的其他数据。预期的输出是返回一个包含新文件的字节数组。不幸的是,在发送请求时我收到一个错误:响应状态代码不表示成功:413(请求实体太大)。

该错误似乎仅在文件开始时才发生,这是有道理的。我所做的研究似乎指向 IIS 中的设置,主要是 maxAllowedContentLength、maxRequestLength 和 uploadReadAheadSize。我尝试将这些值增加到更适合此过程的值,但似乎没有任何效果。我已经针对 web 应用程序和 web api 调整了它们,因为我不确定是哪一个导致了问题。

问题出在哪里?在应用程序中、API 中,还是两者兼而有之?我是否缺少其他设置以允许增加尺寸?我发送请求的方式有问题吗?任何帮助表示赞赏。

    public static async Task<byte[]> CreatePdfFromImageFilesAsync(List<ImageFile> imageFiles)
    {
        var list = new List<dynamic>();
        foreach (var item in imageFiles)
        {
            list.Add(new
            {
                Data = Convert.ToBase64String(item.Bytes),
                PageOrder = item.PageOrder,
                Rotation = item.Rotation,
                Type = "PDF"
            });
        }

        var response = _client.PostAsJsonAsync($"{FileCreatorAPI}/api/files/CreateFileFromMultiple", list).Result;
        var result = response.EnsureSuccessStatusCode();
        var bytes = await result.Content.ReadAsAsync<byte[]>();
        return bytes;
    }

【问题讨论】:

    标签: asp.net asp.net-core iis asp.net-web-api http-status-code-413


    【解决方案1】:

    以下更改对我有用

                    // If using Kestrel:
                    .Configure<KestrelServerOptions>(options =>
                    {
                        options.AllowSynchronousIO = true;
                        //options.Limits.MaxRequestBodySize = null; --did not worked
                        options.Limits.MaxRequestBodySize = int.MaxValue;
                    })
                    // If using IIS:
                    .Configure<IISServerOptions>(options =>
                    {
                        options.AllowSynchronousIO = true;
                        //options.MaxRequestBodySize = null;
                        options.MaxRequestBodySize = int.MaxValue;
                    });
    

    创建 web.config 文件并添加以下配置

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.webServer>
        <security>
          <requestFiltering>
            <requestLimits maxAllowedContentLength="2147483648" />
          </requestFiltering>
        </security>
      </system.webServer>
    </configuration>
    

    【讨论】:

    • 配置更改就足够了,.Configure&lt;IISServerOptions&gt; 不需要。
    【解决方案2】:

    你能检查那个属性 https://github.com/aspnet/Announcements/issues/267 吗? 使用

    [RequestSizeLimit(100_000_000)] 
    

    在您的控制器入口点上,或者以这种方式更全局地设置它:

    .UseKestrel(options =>
    {
        options.Limits.MaxRequestBodySize = null;
    

    编辑:来自 MS 的文章:https://dotnet.microsoft.com/download/dotnet-core

    【讨论】:

    • 我添加了属性,但得到了相同的结果。
    • 我有那个 setup + web.config 和你提到的参数,它正在解决 HTTP 413 错误。你把两者结合起来了吗?
    • 是的,我将这两个部分都添加到我的应用程序中,但它仍然给出相同的响应。
    • 我能够回到这一点,在再次发布后,这似乎解决了我的问题,同时增加了 IIS 中的设置。
    【解决方案3】:

    我认为问题出在服务器上。服务器正在终止请求,因为它超出了配置的最大允许请求大小。

    您使用的是哪个服务器? 对于 Nginx 用户,决定允许 HTTP 请求大小的指令是client_max_body_size,默认最大允许请求大小为 1MB。 Apache 中的限制是通过 LimitRequestBody 指令设置的,默认为 0(表示无限制)到 2147483647 (2GB)。

    查看this article,了解如果您使用这两个服务器中的任何一个,如何修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-30
      • 2014-12-23
      • 2012-09-23
      • 2015-10-04
      • 2015-01-25
      • 2014-12-04
      相关资源
      最近更新 更多