.NET 6中RequestSizeLimitAttribute在WebApi控制器中失效问题
问题原因与解决方案
核心原因
你遇到的问题本质是:当控制器方法参数为自定义复杂类型(如Myfile)时,ASP.NET Core会在执行请求大小检查前,提前将整个请求体读取并反序列化为该对象。此时RequestSizeLimit的限制逻辑已经无法拦截请求,因为请求体已经被完整加载到内存中,自然会进入控制器方法。
具体解决方案
1. 改用直接读取HttpRequest的方式
避免让框架自动反序列化复杂对象,手动读取请求体并处理,这样请求大小检查会在读取请求体前生效:
[ApiController] [Route("api/myfiles")] public class MyFileController : ControllerBase { [HttpPost()] [Authorize(Roles = "admin")] [RequestSizeLimit(1024)] public async Task<ActionResult<MyFile>> SaveMyFile() { // 手动读取并反序列化请求体 using var reader = new StreamReader(Request.Body); var jsonContent = await reader.ReadToEndAsync(); var file = JsonSerializer.Deserialize<Myfile>(jsonContent); // 后续业务逻辑 // ... } }
2. 若为文件上传场景,改用IFormFile参数
如果你的Myfile类是用于处理文件上传,直接使用IFormFile(或IFormFileCollection)作为参数,框架会采用流式处理,不会提前加载整个请求体,此时RequestSizeLimit会正常生效:
[HttpPost()] [Authorize(Roles = "admin")] [RequestSizeLimit(1024)] public async Task<ActionResult<MyFile>> SaveMyFile(IFormFile file) { // 处理文件逻辑 // ... }
3. 确认全局配置未限制端点级覆盖
确保Program.cs中未设置全局固定请求大小限制,允许端点通过特性覆盖:
builder.Services.AddControllers(options => { // 设置为null允许端点级特性覆盖全局限制 options.MaxRequestBodySize = null; });
4. 验证测试请求的实际Content-Length
确认集成测试中发送的请求实际Content-Length确实超过1024字节。例如二进制数组转Base64后长度会增加约1/3,加上JSON结构的额外字符,需确保总长度达标,否则不会触发限制。
内容的提问来源于stack exchange,提问作者Ben Zuill-Smith
相关产品推荐
相关产品推荐

