0

当我需要限制文件上传 WebAPI 端点的允许请求大小时,我有一个用例。通常我会使用内置属性RequestSizeLimit

    [HttpPost]
    [RequestSizeLimit(104_857_600)] // 100mb limit
    public async Task<IActionResult> Upload([FromForm] IFormFile file) {

    }

但是,根据要求,我需要使请求大小限制可配置并与应用程序的其余部分共享(例如,SPA 应用程序在用户上传文件之前使用相同的值进行自己的验证,也使用单元测试等。 .)。因此,为了涵盖这个用例,我实现了自己的操作过滤器:

public class CustomRequestSizeValidatorAttribute : ActionFilterAttribute
{
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        var request = context.HttpContext.Request;
        var contentLength = request.ContentLength;

        if (contentLength > SharedConsts.MaximumFileUploadSize)
        {
            var errorMessage = "Request content length is too large";
            context.Result = new BadRequestObjectResult(errorMessage);
        }
        else
        {
            await next();
        }
    }
}

和:

public static class SharedConsts
{
    public static readonly long MaximumFileUploadSize = 104_857_600; // 100 mb
}

并将其用作:

    [HttpPost]
    [CustomRequestSizeValidator]
    public async Task<IActionResult> Upload([FromForm] IFormFile file) {

    }

问题来了。我通过以下方式上传180mb文件Postman,这是服务响应时间:

  • 没有 2 个属性中的任何一个 ~ 2.5 - 3 秒
  • [CustomRequestSizeValidator]同一时间(2.5 - 3秒)
  • [RequestSizeLimit]22毫秒!

为什么我的自定义属性[CustomRequestSizeValidator]这么慢,以及如何使请求的执行速度与 MS 的本机属性一样快[RequestSizeLimit]

从诊断工具中,我看到使用[CustomRequestSizeValidator]属性时 - 每次发出请求时内存消耗都会增加。有了[RequestSizeLimit]属性 - 内存永远不会增长。所以问题可能是框架执行逻辑的顺序。我的自定义属性很可能作为管道中的最后一步执行。但我仍然不知道如何修复它,所以欢迎任何建议。

4

0 回答 0