2013-02-01 6 views
4

У меня есть объект с именем агентство со следующими APIsASP NET Web API шаблоны Route

GET  http://localhost:37331/api/agency?start=1&limit=10&status=1 
GET  http://localhost:37331/api/agency/2 
POST http://localhost:37331/api/agency 
PUT  http://localhost:37331/api/agency 
DELETE http://localhost:37331/api/agency/4 
POST http://localhost:37331/api/agency/activate/3 
POST http://localhost:37331/api/agency/deactivate/3 
GET  http://localhost:37331/api/agency/types 

Шаблоны маршрутов, которые я использовал в

 config.Routes.MapHttpRoute(
      name: "ControllerActionIdApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { }, 
      constraints: new { id = @"\d+" } 
     ); 
     // 
     config.Routes.MapHttpRoute(
      name: "ControllerActionApi", 
      routeTemplate: "api/{controller}/{action}" 
     ); 
     // 
     config.Routes.MapHttpRoute(
      name: "ControllerIdApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { }, 
      constraints: new { id = @"\d+" } 
     ); 
     // 
     config.Routes.MapHttpRoute(
      name: "ControllerApi", 
      routeTemplate: "api/{controller}" 
     ); 

Очевидно, что существует неоднозначное между 2-й и 3-й. У меня есть обходное решение, которое помещает идентификатор в строку запроса

GET  http://localhost:37331/api/agency?id=2 
DELETE http://localhost:37331/api/agency?id=4 

Я думаю, что должен быть умный способ. Не могли бы вы предложить по этому поводу?

Благодаря

+0

Какие из них дают вам ошибки? – AgnosticDev

+0

URL 2 и 5. Спасибо –

+0

Можете ли вы не просто поменять порядок своего 2-го и 3-го маршрутов? Они сопоставляются последовательно с вашими ограничениями: new {id = @ "\ d +"} на 3-м месте не получает внешний вид, потому что второй маршрут всегда будет выигрывать. –

ответ

7

Маршруты сопоставляются в последовательности. Ваше ограничение: новый {id = @ "\ d +"} на третьем маршруте не получает вид, потому что второй маршрут всегда будет выигрывать.

Итак, замените 2-й и 3-й маршруты вокруг.

Всегда устанавливайте наиболее избирательные маршруты вверху.

config.Routes.MapHttpRoute(
     name: "ControllerActionIdApi", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { }, 
     constraints: new { id = @"\d+" } 
    ); 
    // 

    config.Routes.MapHttpRoute(
     name: "ControllerIdApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { }, 
     constraints: new { id = @"\d+" } 
    ); 
    // 
    config.Routes.MapHttpRoute(
     name: "ControllerActionApi", 
     routeTemplate: "api/{controller}/{action}" 
    ); 
    // 
    config.Routes.MapHttpRoute(
     name: "ControllerApi", 
     routeTemplate: "api/{controller}" 
    ); 
0

Попробуйте

routeTemplate: "api/{controller}/{action}/{id}" 
+0

Это не работа. Как правило, существует четыре шаблона, ваши маршруты охватывают только один из них. Благодарю. –

Смежные вопросы