Тот же url для перегруженных методов контроллера
В моем приложении web api я хочу, чтобы клиенты могли делать запросы, используя тот же путь, но передавая другой тип параметров.
Например:
public class MyController : ApiController
{
[HttpDelete]
public IHttpActionResult Delete(int id) {..}
[HttpDelete]
public IHttpActionResult Delete2(Guid id) {..}
[HttpDelete]
public IHttpActionResult Delete3(string id) {..}
}
Я хочу, чтобы url-адрес для каждого метода был похож, например:
api/MyController/1
api/MyController/abc etc..
Возможно ли это? Iv'e перепробовал множество комбинаций с атрибутом ActionName и конфигурацией маршрутизации, но ничего не сработало.
Спасибо
3 ответов:
Для этого можно использовать атрибутивную маршрутизацию. Например:
[RoutePrefix("MyController")] public class MyController : ApiController { [HttpDelete] [Route("delete/{id:int}")] public IHttpActionResult Delete(int id) {..} [HttpDelete] [Route("delete/{id:guid}")] public IHttpActionResult Delete2(Guid id) {..} [HttpDelete] [Route("delete/{id:alpha}")] public IHttpActionResult Delete3(string id) {..} }Если вы сделаете это, то url запроса будет:
http://yoursever/mycontroller/delete/123 http://yoursever/mycontroller/delete/abc http://yoursever/mycontroller/delete/91c74f8f-d981-4ee1-ba36-3e9416bba202
Вам нужно предоставить
Routeс различными типами параметров для каждого из ваших методов:[RoutePrefix("api/MyController")] public class MyController : ApiController { [HttpDelete] [Route("{id:int}", Order = 1)] public IHttpActionResult Delete(int id) {..} [HttpDelete] [Route("{id:guid}", Order = 2)] public IHttpActionResult Delete2(Guid id) {..} [HttpDelete] [Route("{id}", Order = 3)] public IHttpActionResult Delete3(string id) {..} }Конечно, вы должнывключить маршрутизацию атрибутов , Если вы этого еще не сделали.
СвойствоOrderдля атрибутаRouteгарантирует, что шаблоны маршрутов проверяются в правильном порядке, так что значениеintне будет соответствовать строковому маршруту.
Да, это возможно. Попробуйте задать маршрут в виде
decoration.Пример:
[Route("DeleteThis/{id}")] [HttpDelete] public IHttpActionResult DeleteThis(int id) { return Ok(); } [Route("NowDeleteThis/{name}")] [HttpDelete] public IHttpActionResult DeleteThis(string name) { return Ok(); }
Comments