我有一个 .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 的方法(例如分块对我来说不起作用)?
正如评论和MSDOC中提到的,Http Trigger 函数对 http 请求的大小限制为 100MB。 但是,您可以使用
InputStream
方法处理像 800MB 这样的大文件,请参阅此处的 解决方案。
实现相同目的的另一种方法是使用自定义容器,使用 Dockerfile 覆盖 web.config,如 GitHub issue1 和 issue2 中所述。 每次都需要重建容器并部署。
实现您的要求的更好方法是使用 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}");
}
容器中上传的文件:
控制台输出:
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
传送门: