C# 如何正确映射WebAPI路由
我正在使用Web API为类似Twitter的站点构建API,但在映射路由时遇到了问题 我对用户控制器执行以下操作:C# 如何正确映射WebAPI路由,c#,asp.net,asp.net-mvc,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Asp.net Web Api Routing,我正在使用Web API为类似Twitter的站点构建API,但在映射路由时遇到了问题 我对用户控制器执行以下操作: public User Get(string firstname, string lastname) public User Get(Guid id) public User Friends(Guid id) public User Followers(Guid id) public User Favorites(Guid id) 所需路线和生成的文件应为: api/users
public User Get(string firstname, string lastname)
public User Get(Guid id)
public User Friends(Guid id)
public User Followers(Guid id)
public User Favorites(Guid id)
所需路线和生成的文件应为:
api/users?firstname={firstname}&lastname={lastname}
api/users/{id}
api/users/{id}/friends
api/users/{id}/followers
api/users/{id}/favorites
在WebApiConfig.cs中,我有:
config.Routes.MapHttpRoute(
"2",
"api/{controller}/{id}",
new { action = "get", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
"1",
"api/{controller}/{id}/{action}"
);
如何正确映射WebAPI路线?关于此主题,有多种有用的参考资料,例如:
config.Routes.MapHttpRoute(
name: "2",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "Get", id = RouteParameter.Optional },
);
config.Routes.MapHttpRoute(
name: "1",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null
);
我能看到的主要错误是,在路线“1”中,您的操作/id顺序错误。鉴于您希望的灵活性,您应该查看一下 在WebApiConfig.cs中启用属性路由,如
// Web API routes
config.MapHttpAttributeRoutes();
在用户控制器中
注意给定动作的名称朋友、追随者和收藏夹
它们意味着返回集合而不是单个用户
[RoutePrefix("api/users")]
public class UserController: ApiController {
//eg: GET api/users?firstname={firstname}&lastname={lastname}
[HttpGet]
[Route("")]
public User Get([FromUri]string firstname,[FromUri] string lastname) {...}
//eg: GET api/users/{id}
[HttpGet]
[Route("{id:guid}")]
public User Get(Guid id){...}
//eg: GET api/users/{id}/friends
[HttpGet]
[Route("{id:guid}/friends")]
public IEnumerable<User> Friends(Guid id){...}
//eg: GET api/users/{id}/followers
[HttpGet]
[Route("{id:guid}/followers")]
public IEnumerable<User> Followers(Guid id){...}
//eg: GET api/users/{id}/favorites
[HttpGet]
[Route("{id:guid}/favorites")]
public IEnumerable<User> Favorites(Guid id){...}
}
[RoutePrefix(“api/用户”)]
公共类用户控制器:ApiController{
//例如:获取api/用户?firstname={firstname}&lastname={lastname}
[HttpGet]
[路线(“”)
公共用户获取([FromUri]字符串名,[FromUri]字符串名){…}
//例如:获取api/users/{id}
[HttpGet]
[路由(“{id:guid}”)]
公共用户获取(Guid id){…}
//例如:获取api/users/{id}/friends
[HttpGet]
[路由(“{id:guid}/friends”)]
公共IEnumerable好友(Guid id){…}
//例如:获取api/users/{id}/followers
[HttpGet]
[路由(“{id:guid}/followers”)]
公共IEnumerable Followers(Guid id){…}
//例如:获取api/users/{id}/favorites
[HttpGet]
[路由(“{id:guid}/favorites”)]
公共IEnumerable收藏夹(Guid id){…}
}
路由对订单敏感。第一场比赛总是赢。因此,从最具体的路线到最不具体的路线进行排序是很重要的
// All parameters are required, or it won't match.
// So it will only match URLs 4 segments in length
// starting with /api.
config.Routes.MapHttpRoute(
"1",
"api/{controller}/{id}/{action}"
);
// Controller is required, id is optional.
// So it will match any URL starting with
// /api that is 2 or 3 segments in length.
config.Routes.MapHttpRoute(
"2",
"api/{controller}/{id}",
new { action = "get", id = RouteParameter.Optional }
);
当您的路由按这种方式排序时,您将获得预期的行为。查看了所有这些