Web API Core 3.1 中的参数绑定(字符串到整数)

Parameter Binding (string to int) in Web API Core 3.1

我的控制器中有两个 GET 方法。

[HttpGet("{userId:int}", Name= nameof(GetUserById))]
GetUserById 

[HttpGet("{name:alpha}", Name=nameof(GetUserByName))]
GetUserByName

很遗憾,存在名为“007”的用户。当我调用 http://api/Users/007 时,第一个方法被调用,因为系统将其视为值为 7 的整数。

有没有可能将请求定向到第二种方法而不使其成为查询参数的方法?

I call http://api/Users/007, the first method is being called since the system treats it as an integer with value 7.

由于路由限制,指定的 URL 与 GetUserByName 路由不匹配。 alpha 约束只接受字母,不接受数字。您必须将约束更改为限制较少的接受参数中的数字或完全删除约束。参见:Route constraint reference

区分这两者的最可靠方法是使用不同的模板:

[HttpGet("{userId:int}", Name= nameof(GetUserById))] // leave it as is
GetUserById

<...>
[HttpGet("name/{name}", Name=nameof(GetUserByName))] // add segment to route
GetUserByName

ASP.NET路由器不知道“007”应该被视为字符串,因为有这样的用户。您的意图应该更具体,如果参数值可以匹配多个端点,则制作不同的端点路由。因此,路由器会将请求路由到正确的操作,而不是尝试找到可能不是您的最佳匹配的最佳匹配。