【问题标题】:Asp.net Core 2.0 RequestSizeLimit attribute not workingAsp.net Core 2.0 RequestSizeLimit 属性不起作用
【发布时间】:2018-10-17 15:41:36
【问题描述】:

我在 Asp.net core 2.0 中创建一个允许上传文件的网站。我很快遇到了30MB 上传限制的问题,并收到了来自服务器的404 响应。低于此限制一切正常。

我在网上找到了很多这样的解决方案: Increase upload file size in Asp.Net core。我的问题是我无法让这个解决方案发挥作用,并且在超过30MB 时我仍然收到404 响应。

我的调用是一个 ajax 调用,如下所示:

function uploadMedia(isPhoto, files) {
  var type;
  if (isPhoto) {
    type = "i";
  } else {
    type = "v";
  }

  var data = new FormData();
  if (files.length > 0) {
    for (idx = 0; idx < files.length; idx++) {
      if (files[idx].size < 1074790400) {
        data.append("fileImage" + idx, files[idx]);
      } else {
        BootstrapDialog.show({
          type: BootstrapDialog.TYPE_WARNING,
          title: "Validation Error",
          message: "The maximum file size for images is 1GB. Please resize your image and upload again.",
          buttons: [
            {
              label: "OK",
              action: function(dialogItself) {
                dialogItself.close();
              }
            }
          ]
        });
      }
    }

    $.ajax({
      url: "/api/article/uploadfile/" + type,
      type: "POST",
      processData: false,
      contentType: false,
      dataType: false,
      data: data,
      success: function(jsonData) {
        refreshUploadedImages(jsonData, isPhoto);
      }
    });
  }
}

function rotateImageAnticlockwise(element) {
  var id = $(element).attr("data-id");
  var mediaData = getMediaData(id, true);

  $.ajax({
    url: "/api/article/rotateMedia/a/p/" + mediaData.fileId + "/" + mediaData.rotation,
    type: "POST",
    processData: false,
    contentType: false,
    success: function(jsonData) {
      refreshRotatedImage(jsonData);
    }
  });
}

然后我的服务器端方法有这样的属性:

[HttpPost]
[RequestSizeLimit(1074790400)]
[Route("api/article/uploadfile/{mediaType}")]
public async Task<IActionResult> UploadFile(string mediaType)

谁能看到我做错了什么?这快把我逼疯了!!!

【问题讨论】:

  • 只是一个想法,作为故障排除步骤,您是否尝试过 1) 注释掉您的 JS if (files[idx].size &lt; 1074790400) 块(只是周围的块,以便执行 data.append 和 2)在操作方法(而不是设置显式限制)?
  • @egnomerator - 我都试过了,但不幸的是仍然遇到同样的错误。
  • 只是为了确保我没有做出错误的假设,您的应用程序由 IIS 托管而不是自托管?抱歉,如果这是在某处指定的,我错过了。
  • 我正在从 Visual Studio 将网站作为标准 .net core 2.0 asp.net 应用程序运行。

标签: javascript c# asp.net-core


【解决方案1】:

对于其他有同样问题的人,这就是答案。

Mark LaFleur 的回答是正确的方向,但 web.config 缺少关键部分。

我得到了帮助,但这个网页解释了有关 Asp.net Core 中 web.config 文件的更多信息: ASP.NET Core Module configuration reference

要停止此错误,您需要创建一个包含以下内容的 web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <security>
      <requestFiltering>
        <!-- This will handle requests up to 50MB -->
        <requestLimits maxAllowedContentLength="52428800" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

【讨论】:

  • 非常感谢,它就像一个魅力!您知道另一种无需创建 web.config 即可解决相同问题的方法吗?我的意思是从代码本身,或者如果我们可以从 ASP CORE 项目中的内置 appsettings.json 中做到这一点。
【解决方案2】:

RequestSizeLimit 属性允许您在代码中定义最大请求大小,但它仍然受到服务器本身支持的最大请求大小的限制。

在这种情况下,我怀疑您收到此错误:

HTTP 404.13 - Not Found
The request filtering module is configured to deny a request that exceeds the request content length.

此错误由 ISS 触发,因为调用超出了 IIS 的 maxAllowedContentLength 值(默认值为 30,000,000)。来自the documentation

以下错误表示您的文件上传超出了服务器配置的maxAllowedContentLength。默认设置为30000000,大约为28.6MB。该值可以通过编辑web.config来自定义:

<system.webServer>
  <security>
    <requestFiltering>
      <!-- This will handle requests up to 50MB -->
      <requestLimits maxAllowedContentLength="52428800" />
    </requestFiltering>
  </security>
</system.webServer>

【讨论】:

  • 我确实尝试像这样添加一个 web.config,但后来我遇到了另一个问题。当我尝试从 Visual Studio 运行应用程序时,我收到以下错误:'Web 服务器请求失败,状态代码为 500。内部服务器错误。然后完整的响应显示“HTTP 错误 500.19 - 内部服务器错误 - 无法访问请求的页面,因为该页面的相关配置数据无效。”
  • 这可能是由许多设置引起的。事实证明,ISS 中的一个功能通常没有安装在服务器上。您使用哪个版本的 IIS 来托管网站?
  • 我没有尝试将应用部署到服务器,只是尝试从 Visual Studio 运行它
  • 看看stackoverflow.com/a/11961615/105518的cmets。听起来 IIS Express 需要覆盖它的默认配置。另一种选择是使用本地 IIS 实例而不是 IIS Express。
  • 另外,如果你只是在没有 IIS 的情况下使用 Kestel,你可能想看看这些选项:docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2019-05-05
  • 2018-08-27
相关资源
最近更新 更多