C# Web Api 路由

C# Web Api Routing

目标:我想定义 REST 动词名称并将它们 link 到 REST 路由。接下来,我想将自定义规则映射到定义的操作名称:

GET / => Get()
GET /1 => Get(int id)
POST / => Post()
PUT / => Put()
DELETE /1 => Delete(int id)
GET /custom => [HttpGet][ActionName("custom")] GetCustom()

我在 OwinStartup.cs:

httpConfiguration.Routes.MapHttpRoute (
    name: "ControllerWithId",
    routeTemplate: "rest/{controller}/{id}",
    constraints: new {
        id = @"^\d+$"
    },
    defaults: new {
        action = "Index",
        id = RouteParameter.Optional
});
httpConfiguration.Routes.MapHttpRoute (
    name: "ControllerWithAction",
    routeTemplate: "rest/{controller}/{action}/{id}",
    defaults: new {
        action = "Index",
        id = RouteParameter.Optional
    });

我有一个 ApiController:

public class MyController : ApiController {
    public async Task<IEnumerable<object>> Get() {}
    public async Task<object> Get(int id) {}
    public async Task Post([FromBody] data) {}
    public async Task Put(int id, [FromBody] data) {}
    public async Task Delete(int id) {}
    [HttpGet][ActionName("custom")]
    public async Task Custom() {}
}

它们都是 return 404 除了自定义。必须向每个 REST 方法添加一个 ActionName 会很糟糕。最简洁的解决方案是什么?

ASP.NET MVC 没有提供一种使用其命名约定的简单方法 CRUD/custom 端点。我走了丑陋的路线,并为每个 CRUD 方法明确指定 ActionName("")

reyan-chougle 的解决方案要求您在代码中硬编码字符串,这是不好的做法。我尝试向属性添加魔法字符串,但遇到编译器错误。

解决方案:

    [HttpGet]
    [ActionName (Consts.defaultActionMethdName)]
    public IEnumerable<Model> Get () {}

    [HttpGet]
    [ActionName (Consts.defaultActionMethdName)]
    public Model Get (int id) {}

    [ActionName (Consts.defaultActionMethdName)]
    public IHttpActionResult Post ([FromBody] Model input) {}

    [ActionName (Consts.defaultActionMethdName)]
    public IHttpActionResult Put (int id, [FromBody] Model input) {}

    [ActionName (Consts.defaultActionMethdName)]
    public IHttpActionResult Delete (int id) {}

    [HttpGet]
    [ActionName("custom")]
    public async Task Custom() {}