允许带有 ASP.NET MVC 路由的字符串 ID

Allow string ID with ASP.NET MVC route

我设置了以下 2 个路由,并且在发送有效请求时它们工作正常。

config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");

我想测试一些错误的请求以确保响应正确。我正在尝试在我的控制器中调用以下操作。

public HttpResponseMessage Get(string id)
{
    //output the id again
}

如果我调用 localhost:80/users/123,我会得到一个有效的响应,它将输出 123。当我尝试使用无效的 ID 时,例如,包含字母的失败并出现以下错误。

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:80/users/d1g'.","MessageDetail":"No action was found on the controller 'Users' that matches the name 'd1g'."}

我知道出了什么问题。这个请求应该匹配第一条路由,而不是匹配第二条路由。我有 2 个名为 Get 的方法。一个接受 ID,另一个不需要 ID。不需要 ID returns 所有记录列表的那个。我在这方面遇到了很多麻烦,上面的路线是我解决问题的方法。

通过删除约束来更新路由,使用避免冲突的操作更新路由,然后切换顺序。

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}"
    new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional }
);