首页 > 解决方案 > 使用路由约束时,如果路由参数验证失败,为什么 API 返回 404 而不是 400

问题描述

我有一个 .NET Core Web API 项目,想在运行业务逻辑之前验证路由参数。鉴于此示例端点

[HttpGet("{username:maxlength(30)}")]
public async Task<ActionResult<object>> GetUser([FromRoute] string username)
{
    // ...
}

用户名永远不会超过 30 个字符。当使用超过 30 个字符的用户名调用端点时,API 将以 404 响应进行响应。我希望 400 带有类似的消息

“用户名”必须大于 0 且小于 31 个字符

我错了吗?这有什么原因吗?

标签: c#asp.net-core.net-coreasp.net-core-webapi

解决方案


路由约束用于消除相似路由的歧义,如果约束用于输入验证,无效输入会导致 404 Not Found 响应。

更多信息,请查看:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#route-constraint-reference

如评论中所述,要为无效输入生成 400 Bad Request,一些内置属性(例如StringLengthetc)可以帮助实现要求。


推荐阅读