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() {}
目标:我想定义 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() {}