Azure Functions 有效负载大小限制

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

我有一个 .NET 8 独立的 Azure 函数项目。我确实有一个 HTTP 触发函数,应该接收一些文档内容作为有效负载。最初,每次我发布大于 28MB 的负载时,我都会得到

413 Entity Too Large
。因此,我将 Program.cs 中的配置更改为以下内容:

_ = services.Configure<KestrelServerOptions>(opt => opt.Limits.MaxRequestBodySize = 524288000);

在我将函数部署到 Azure 之前,这一切都非常有效。函数应用程序部署在 Windows 操作系统上的高级计划 (P1v3) 上。在 Azure 中发生的情况是,尽管进行了上述配置,我仍无法传递超过 200 MB 的有效负载。每次我过去都会得到

413 Entity Too Large
。将配置更改为 200MB 以下的内容已被正确选择并设置了限制,但看起来有效负载大小存在硬性限制。

我还尝试将

MaxRequestBodySize
设置为
null
,这应该会导致有效负载大小不受限制(基于文档)。由于这不起作用,我尝试用
[DisableRequestSizeLimit]
装饰该函数,但没有成功。

这是我的

Program.cs
:

IHost host = new HostBuilder()
     .ConfigureFunctionsWebApplication()
     .ConfigureAppConfiguration(config =>
     {
         IConfiguration configuration = new ConfigurationBuilder()
                        .SetBasePath(Environment.CurrentDirectory)
                        .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                        .AddUserSecrets(Assembly.GetExecutingAssembly(), true)
                        .AddEnvironmentVariables()
                        .Build();
         _ = config.AddConfiguration(configuration);
     })
     .ConfigureServices((builder, services) =>
     {
         _ = services.Configure<KestrelServerOptions>(opt => opt.Limits.MaxRequestBodySize = builder.Configuration.GetValue<long>("FUNCTIONS_REQUEST_BODY_SIZE_LIMIT"));
     })
    .Build();

await host.RunAsync();

更新2024年12月11日

经过进一步挖掘,我能够在

web.config
存储库中找到以下
azure-functions-host
文件。

https://github.com/Azure/azure-functions-host/blob/dev/src/WebJobs.Script.WebHost/web.config

<requestLimits maxQueryString="4096" maxUrl="8192" maxAllowedContentLength="210000000"/>

据我所知,

maxAllowedContentLength
设置为
210000000 (200.27MB)
。据我所知,如果
web.config
部署为函数应用程序的一部分,它将被忽略。现在还是这样吗?是否还有其他解决方法,或者我唯一的选择是更改使用 blob 的方法(例如分块对我来说不起作用)?

azure azure-functions .net-8.0 kestrel-http-server azure-functions-isolated
1个回答
0
投票

正如评论和MSDOC中提到的,Http Trigger 函数对 http 请求的大小限制为 100MB。 但是,您可以使用

InputStream
方法处理像 800MB 这样的大文件,请参阅此处的 解决方案

实现相同目的的另一种方法是使用自定义容器,使用 Dockerfile 覆盖 web.config,如 GitHub issue1issue2 中所述。 每次都需要重建容器并部署。

实现您的要求的更好方法是使用 blob 存储来管理大尺寸文件。

我创建了一个 Blob 触发器 Azure 函数,并且能够通过将 200MB 大小的文件上传到存储容器来触发该函数。

[Function(nameof(Function))]
public async Task Run([BlobTrigger("samples/{name}", Connection = "demo")] Stream stream, string name)
{
    using var blobStreamReader = new StreamReader(stream);
    var content = await blobStreamReader.ReadToEndAsync();
    _logger.LogInformation($"C# Blob trigger function Processed blob\n Name: {name} \n Data: {content}");
}

容器中上传的文件:

enter image description here

控制台输出:

Functions:

        Function: blobTrigger

For detailed output, run func with --verbose flag.
[2024-11-12T12:15:25.998Z] Host lock lease acquired by instance ID '000000000000000000000000F72731CC'.
[2024-11-12T12:21:02.103Z] Executing 'Functions.Function' (Reason='New blob detected(LogsAndContainerScan): samples-workitems/sample_payload.txt', Id=137a93d7-963b-48e7-93bd-e36b7683d741)
[2024-11-12T12:21:02.111Z] Trigger Details: MessageId: 33d4a36c-0cc8-44b9-ae7c-3cb08758bc30, DequeueCount: 2, InsertedOn: 2024-11-12T12:10:51.000+00:00, BlobCreated: 2024-11-12T12:10:44.000+00:00, BlobLastModified: 2024-11-12T12:10:44.000+00:00
[2024-11-12T12:22:46.043Z] Executing 'Functions.Function' (Reason='New blob detected(LogsAndContainerScan): samples/sample_payload.txt', Id=74de2755-2aeb-4b43-8011-69b23c94fe78)
[2024-11-12T12:22:46.047Z] Trigger Details: MessageId: 71e3c673-a9bc-4d62-a934-08dec80e2589, DequeueCount: 1, InsertedOn: 2024-11-12T12:22:45.000+00:00, BlobCreated: 2024-11-12T12:22:38.000+00:00, BlobLastModified: 2024-11-12T12:22:38.000+00:00

传送门: enter image description here

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