У меня есть маршрут по умолчанию в Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Я хотел иметь возможность настроить таргетинг на конкретную функцию, поэтому создал другой маршрут:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Итак, в моем контроллере у меня есть:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Звонок .../api/records/bycategoryid/5
даст мне то, что я хочу. Однако звонок .../api/records/1
даст мне ошибку
Было обнаружено несколько действий, соответствующих запросу: ...
Я понимаю, почему это так - маршруты просто определяют, какие URL-адреса действительны, но когда дело доходит до сопоставления функций, оба Get(int id)
и ByCategoryId(int id)
сопоставление api/{controller}/{id}
, что сбивает структуру.
Что мне нужно сделать, чтобы маршрут API по умолчанию снова заработал и сохранил прежний {action}
? Я подумал о создании другого контроллера, названного RecordByCategoryIdController
в соответствии с маршрутом API по умолчанию, который я бы запросил .../api/recordbycategoryid/5
. Однако я считаю это «грязным» (а значит, неудовлетворительным) решением. Я искал ответы на этот вопрос, и ни один учебник по использованию маршрута {action}
даже не упоминает эту проблему.
источник
id
это необязательно, то URL-адрес, например,/api/{part1}/{part2}
может все еще перейти вDefaultApi
маршрут, если для маршрута не найдено соответствующее действиеWithActionApi
. Пожалуйста, поправьте меня, если я ошибаюсь.Решить проблему можно с помощью Attribute routing.
Контроллер
URI в jquery
Конфигурация маршрута
и ваша маршрутизация по умолчанию работает как маршрутизация по умолчанию на основе соглашений
Контроллер
URI в JQuery
Конфигурация маршрута
Обзорная статья для получения дополнительной информации маршрутизации атрибутов и ОНВЕНЦИИ основы маршрутизации здесь и это
источник
Попробуй это.
источник
Возможная причина также может заключаться в том, что вы не унаследовали контроллер от ApiController. Со мной случилось время, чтобы понять то же самое.
источник
Чтобы различать маршруты, попробуйте добавить ограничение, что id должен быть числовым:
источник