如何正确映射WebAPI路由

Don*_*nny 17 c# asp.net asp.net-mvc asp.net-web-api asp.net-web-api-routing

我正在使用Web API为类似Twitter的网站构建API,并且无法映射路由

我对User控制器执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

所需的路线和生成的文档应该是:

api/users?firstname={firstname}&lastname={lastname}
api/users/{id}
api/users/{id}/friends
api/users/{id}/followers
api/users/{id}/favorites
Run Code Online (Sandbox Code Playgroud)

在WebApiConfig.cs中我有:

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


config.Routes.MapHttpRoute(
     "1",
     "api/{controller}/{id}/{action}"
);
Run Code Online (Sandbox Code Playgroud)

如何正确映射WebAPI路由?

Nko*_*osi 33

鉴于您想要的灵活性,您应该看看

ASP.NET Web API 2中的属性路由

在WebApiConfig.cs中启用属性路由

// Web API routes
config.MapHttpAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)

在UserController中

请注意,Friends, Followers and Favorites它们表示返回集合而不是单个用户的操作名称

[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){...}
}
Run Code Online (Sandbox Code Playgroud)


Nig*_*888 5

路由是顺序敏感的。在第一个比赛总是获胜。因此,重要的是您订购从最具体到最不具体的路由。

// 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 }
);
Run Code Online (Sandbox Code Playgroud)

通过这种方式订购路线后,您将获得预期的行为。


Mik*_*Dub 1

关于这个主题有多种有用的参考资料,例如:

你看过这些吗?

更新..

更好的做法是明确说明哪个参数是哪个,即:

    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
    );
Run Code Online (Sandbox Code Playgroud)

我能看到的主要错误是你在路线“1”中的操作/ ID 顺序错误。