C# 配置webapi2路由以支持不同类型的GET请求(操作/id)

C# 配置webapi2路由以支持不同类型的GET请求(操作/id),c#,.net,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,C#,.net,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我希望能够支持这些URL: // GET: api/Users returns a list (all) // GET: api/Users/5 returns the user with Id 5 // GET: api/Users/Active returns a list (only those not soft-deleted) // POST: api/Users creates a user

我希望能够支持这些URL:

// GET:  api/Users              returns a list (all)
// GET:  api/Users/5            returns the user with Id 5
// GET:  api/Users/Active       returns a list (only those not soft-deleted)
// POST: api/Users              creates a user
我首先尝试以这种方式配置它:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
但是我无法支持
api/Users/Active
请求

所以我试着这样配置它:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
但是我不能支持
api/Users/5
请求


是否可以同时支持这两种路由?

注册多条路由

您还可以提供约束,这些约束限制URI段如何匹配占位符:

constraints: new { id = @"\d+" }   // Only matches if "id" is one or more digits.
范例

// GET:  api/Users              returns a list (all)
// GET:  api/Users/5            returns the user with Id 5
// POST: api/Users              creates a user
config.Routes.MapHttpRoute(
    name: "Api",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional },
    constraints: new { id = @"\d+" }
);

// GET:  api/Users/Active       returns a list (only those not soft-deleted)
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
或启用属性路由

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
控制器

[RoutePrefix("api/users")]
public class UsersController : ApiController {
    // GET:  api/Users              returns a list (all)
    [HttpGet]
    [Route("")] 
    public IHttpActionResult Get() { ... }
    // GET:  api/Users/5            returns the user with Id 5
    [HttpGet]
    [Route("{id:int}")] 
    public IHttpActionResult Get(int id) { ... }
    // GET:  api/Users/Active       returns a list (only those not soft-deleted)
    [HttpGet]
    [Route("Active")] 
    public IHttpActionResult Active() { ... }
    // POST: api/Users              creates a user
    [HttpPost]
    [Route("")] 
    public IHttpActionResult Post(User user) { ... }
}

注册多个RouteThanks,如果我配置2个路由,它将是这样的:
“api/{controller}/{action}”
“api/{controller}/{id}”
(id可选),因为我不会有一个包含action和id的case,
api/Users/Active
api/Users/5
如何知道正确使用哪个路由?请使用约束修复键入“RoutePrefic”->“RoutePrefix”谢谢您的回答。我也觉得很有用。