asp.net-core-webapi - 与 RequestSizeLimit 属性相比,自定义操作过滤器属性的性能较差
问题描述
当我需要限制文件上传 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]
属性 - 内存永远不会增长。所以问题可能是框架执行逻辑的顺序。我的自定义属性很可能作为管道中的最后一步执行。但我仍然不知道如何修复它,所以欢迎任何建议。
解决方案
推荐阅读
- maven - 使用 Gradle 将 SNAPSHOT 发布到 GitHub 包
- node.js - 由于 csp,无法从 aws s3 存储桶获取图像
- windows - 如何获取有关 Vmmem 进程活动的详细信息?
- firebase - 如何使用flutter从firestore中的嵌套集合中进行查询
- node.js - AWS nodejs SDK检查是否可以访问DynamoDB表
- javascript - 无法使用 Selenium 和 Python 在 Qualtrics 上找到元素
- python - Python Regex:Findall从字符串的开头到结尾匹配字符串
- macos - 期望 LAPACK 例程在两种不同的处理器架构上得到相同的结果是否合理?
- git - 引发了“Microsoft.TeamFoundation.Git.Contracts.GitCheckoutConflictException”类型的异常
- raspberry-pi - 使用 DQBUF 上的外部触发器冻结通过 V4L2 进行实时捕获