.NET 9函数应用部署后上传大Azure Blob遇请求体限制问题
.NET 9 Azure函数上传大Blob的问题排查与解决
系列错误及处理过程
1. 首次异常:方法不受支持
- 异常信息:
System.NotSupportedException: '指定的方法不受支持。'
- 环境:.NET 9 + App Service Plan托管的函数应用
- 报错代码行:
var bytesRemaining = req.Body.Length; - 根因:Azure函数的请求体流为非可查找流,无法通过
Length属性获取总长度,该方法在此场景下不被支持。
2. 二次异常:请求体超出Kestrel默认限制
- 修改代码后出现的异常:
Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: '请求体过大。最大请求体大小为30000000字节。'
- 报错代码行:
dataRead = await req.Body.ReadAsync(data, offset, dataToRead); - 根因:Kestrel默认最大请求体大小为30MB,上传的Blob超出此限制。
3. 本地正常但线上仍报错:函数自身请求体限制未配置
- 已执行的处理:
- 配置Kestrel增大请求体限制:
services.Configure<KestrelServerOptions>(options => { options.Limits.MaxRequestBodySize = 300000000; // 设置为300MB });- 使用Azure SDK标准方法上传流:
await blobClient.UploadAsync(blobContent, true);
- 线上异常信息:
执行函数时发生异常: Functions.uploadExtratcs 绑定参数'req'时出错 请求体过大。最大请求体大小为100字节。
- 根因:Azure函数除了Kestrel的配置,还需通过
host.json设置自身的HTTP请求体大小限制。
最终解决方案
在项目的host.json中添加HTTP扩展配置,覆盖默认的请求体大小限制:
{ "extensions": { "http": { "maxRequestBodySize": 300000000 } } }
- 注意:若使用隔离进程部署模型,需确保配置结构正确;同时确认App Service Plan的层级支持大文件上传(避免免费层/共享层的额外限制)。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

