我设置了以下2个路由,并且在发送有效请求时它们正常工作。
config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");
我想测试一些不好的请求以确保响应是正确的。我试图在我的控制器中调用以下Action。
public HttpResponseMessage Get(string id)
{
//output the id again
}
如果我致电localhost:80/users/123
,我会收到有效的回复,并会输出123
。当我尝试使用无效的ID
时,例如,包含字母的字母失败并出现以下错误。
{“Message”:“找不到与请求URI匹配的HTTP资源 'http://localhost:80/users/d1g'。“,”MessageDetail“:”未找到任何操作 在控制器“用户”上匹配名称“d1g”。“}
我可以看到什么是错的。此请求应匹配第一个路由,而是匹配第二个路由。我有两个名为Get
的方法。一个接受ID
,另一个不需要ID
。不需要ID
的那个返回所有记录的列表。我遇到了很多麻烦,上面的路线就是我如何解决这个问题。
答案 0 :(得分:2)
通过删除约束来更新路由,通过操作更新路由以避免冲突,然后切换顺序。
config.Routes.MapHttpRoute(
"DefaultApiWithAction",
"{controller}/{action}/{id}"
new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
"DefaultApiWithId",
"{controller}/{id}",
new { action = "Get", id = RouteParameter.Optional }
);