【发布时间】:2014-04-13 13:23:51
【问题描述】:
我在以前的项目中广泛使用了 WCF。最近,我一直在探索使用 ASP.NET Web API 创建 RESTful 服务。在研究了 RESTful 服务的 DO 和 DONT 并实际尝试之后,我有一个相当直截了当的问题。
假设我有一个 UsersController(继承 ApiController),我需要有 3 个 GET 类型的操作方法:
GetUsers()
GetUserById(string id)
GetUserByName(string name)
假设我在 WebApiConfig
中也有以下路由
config.Routes.MapHttpRoute(
name: "Users",
routeTemplate: "api/users/{id}",
defaults: new { controller = "users", id = RouteParameter.Optional }
);
http://localhost:<port>/api/users 显然会调用GetUsers()
当我需要调用采用单个参数的两个操作方法中的任何一个时,问题就出现了。
我愿意
http://localhost:<port>/api/users/5c6fe209-821e-475f-920d-1af0f3f52a82 调用GetUserById(string id)
和
http://localhost:<port>/api/users/jdoe 调用GetUserByName(string name)
我期望会发生的情况是,我要么得到一个错误,要么在任何一种情况下都只会调用第一个操作方法。
既然在路由上引入动作去歧义被认为是对纯 RESTful 服务的背离,那么如何让不同的 URL 调用各自的动作方法呢?我搜索了网络,大多数 RESTful 服务示例(纯粹主义者)都停留在第一个操作方法以检索所有内容,而第二个操作方法用于检索单个项目。
【问题讨论】:
标签: c# asp.net-mvc-3 rest asp.net-mvc-routing restful-url