.NET 8独立模式Azure Functions部署后200MB负载限制问题求助
我有一个基于.NET 8独立模式的Azure Functions项目,包含一个HTTP触发函数用于接收大文档内容作为请求负载。本地测试时,负载超过28MB会触发413 Entity Too Large错误,于是在Program.cs中配置Kestrel的请求体大小限制为524288000字节(500MB),本地运行正常。但部署到Windows操作系统的P1v3高级计划Azure环境后,负载超过200MB仍会收到413错误,低于200MB则正常。
已尝试的方案:
- 将
MaxRequestBodySize设为null(按文档应为无限制) - 为函数添加
[DisableRequestSizeLimit]特性
均未解决问题。
后续排查发现,Azure Functions宿主的默认web.config中设置了maxAllowedContentLength="210000000"(约200.27MB),且自行部署的web.config会被Azure忽略。
问题的核心在于:Windows高级计划的Azure Functions前端由IIS托管,IIS的请求体大小限制会先于Kestrel的配置生效。默认宿主的web.config中硬编码了200MB左右的maxAllowedContentLength,导致超过该值的请求被IIS直接拦截,无法到达Kestrel层面。
可通过以下步骤解决:
1. 设置应用配置覆盖IIS限制
在Azure门户的函数应用中,添加或修改应用设置WEBSITE_MAX_REQUEST_BODY_SIZE,值设为你需要的最大请求体字节数(例如524288000表示500MB)。该设置会自动覆盖IIS的maxAllowedContentLength限制。
2. 确保Kestrel配置正确
调整Program.cs中的Kestrel配置,确保其值不小于WEBSITE_MAX_REQUEST_BODY_SIZE,或设为null以取消Kestrel层面的限制:
_ = services.Configure<KestrelServerOptions>(opt => opt.Limits.MaxRequestBodySize = builder.Configuration.GetValue<long?>("FUNCTIONS_REQUEST_BODY_SIZE_LIMIT"));
(注意将类型改为long?以支持null值)
3. 添加函数级别的大小限制禁用
在HTTP触发函数上添加[DisableRequestSizeLimit]特性,确保函数本身不会额外限制请求体大小:
[FunctionName("YourHttpFunction")] [DisableRequestSizeLimit] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { // 函数逻辑 }
4. 重启函数应用
修改应用设置后,需要在Azure门户中重启函数应用,确保所有配置生效。
如果由于环境限制无法修改IIS配置,可考虑:
- 使用Azure Blob Storage作为中转:客户端先将大文件上传至Blob,再向函数发送Blob的访问链接,函数从Blob读取内容处理。此方案避免了直接通过HTTP请求传递大负载。
内容的提问来源于stack exchange,提问作者Vasil Indzhev

