You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:52:58