能否在ASP.NET Core单个路由/Action上设置最大查询长度?
能否为单个ASP.NET Core Action单独设置查询字符串最大长度?
问题描述
我有一个用于返回数据库中Guid键实体的搜索Action,现在需要支持通过Id批量返回多个实体,于是给Action添加了[FromQuery]Guid[] EntityIds参数来接收10-20个实体Id。但现在API因为查询字符串过长报错,我知道可以全局设置最大查询长度,但不想修改整个API的配置,希望像示例那样用[MaxQueryLength(4000)]特性单独给这个Action设置,请问这种方式可行吗?
示例代码:
[HttpGet, MaxQueryLength(4000)] public async Task<IActionResult> Search([FromQuery] Guid[] EntityIds)
回答
ASP.NET Core本身并没有内置[MaxQueryLength]特性,直接使用不会生效,但可以通过自定义特性+过滤器的方式实现针对单个Action的查询长度限制,具体步骤如下:
1. 自定义查询长度限制特性
创建一个继承自ActionFilterAttribute的特性,在Action执行前检查查询字符串长度:
public class MaxQueryLengthAttribute : ActionFilterAttribute { private readonly int _maxLength; public MaxQueryLengthAttribute(int maxLength) { _maxLength = maxLength; } public override void OnActionExecuting(ActionExecutingContext context) { var queryString = context.HttpContext.Request.QueryString.Value; if (!string.IsNullOrEmpty(queryString) && queryString.Length > _maxLength) { context.Result = new BadRequestObjectResult("查询字符串长度超过限制"); return; } base.OnActionExecuting(context); } }
2. 在目标Action上应用特性
直接在你的搜索Action上使用自定义的特性即可:
[HttpGet, MaxQueryLength(4000)] public async Task<IActionResult> Search([FromQuery] Guid[] EntityIds) { // 你的业务逻辑实现 }
补充说明
如果希望更贴合ASP.NET Core的配置体系,也可以使用内置的RequestSizeLimitAttribute,但它默认限制的是整个请求的大小;如果只需要精准限制查询字符串长度,上述自定义过滤器的方式更合适。
另外,在ASP.NET Core 3.1及以上版本中,全局查询长度限制由HttpContext.Features.Get<IHttpRequestFeature>().MaxQueryStringLength控制,自定义过滤器可以在Action级别覆盖这一全局检查逻辑。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

