如何配置 ASP.NET Core 控制器方法的上传文件大小限制

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

我有一个

FileContoller
可以接受大文件上传。为了允许大于 30Mb 的文件,我使用
RequestSizeLimit
属性,如下所示:

private const long _maxFileSize = 1000 * 1000 * 150; // 150 Mb

[HttpPost]
[RequestSizeLimit(_maxFileSize)]
public async Task<ActionResult<IList<UploadResult>>> PostFile([FromForm] IEnumerable<IFormFile> files)
{
    // ....
}

这可行,但我想将硬编码文件限制放在配置文件中 - 这在使用该属性时不起作用。

这个网站上有很多答案,例如。

在 ASP.Net Core 2.2 中定义不同的 API 来接受不同的大小限制

建议通过更改

Program.cs
中的中间件管道来设置限制,这提供了读取注入配置的可能性,如下所示:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>{
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 1000 * 1000 * 150; // 150 Mb;
            //TODO: read hardcoded limit from configuration
  });

但这甚至无法编译:

CS0103 - 当前上下文中不存在名称“上下文”

如何更改上述内容以在当前版本的 .NET Core 中工作?我目前正在将 .NET 6 切换到 .NET 8。

或者,还有其他方法可以从配置中设置

RequestSizeLimit
吗?

asp.net-core file-upload asp.net-core-webapi
1个回答
0
投票

您的代码无法编译的原因是您在 UseWhen 方法中缺少参数。 UseWhen 方法采用两个参数:一个基于 HttpContext 返回布尔值的谓词函数,以及一个采用 IApplicationBuilder 的配置操作。您只提供了第一个参数,但没有提供第二个参数。 要解决此问题,您需要添加一个 lambda 表达式,该表达式采用 IApplicationBuilder 作为参数,并为匹配请求配置中间件管道。例如:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
// This is the second parameter that you are missing
appBuilder.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 1000 * 1000 * 150; // 150 Mb;
//TODO: read hardcoded limit from configuration
await next.Invoke();
});
});

这样就可以为以“/api”路径段开头的请求设置MaxRequestBodySize特性。请注意,您还需要通过调用await next.Invoke()来调用管道中的下一个中间件。

© www.soinside.com 2019 - 2024. All rights reserved.