В сопоставлении маршрутов отсутствуют значения по умолчанию, которые позволили бы таблице маршрутов знать, какой контроллер и какое действие нужно вызвать для маршрутов, соответствующих шаблону
config.Routes.MapHttpRoute(
name: "ReaderTags",
routeTemplate: "Reader/{readerID}/Tags",
defaults: new { controller = "Reader", action = "Tags" }
);
Шаблон маршрута также предполагает, что строковый параметр в действии имеет одно и то же имя: i.e: readerID
.
public IHttpActionResult Tags(string readerID) {
//...
}
А так как config.MapHttpAttributeRoutes();
также настроен, то же самое может быть достигнуто с помощью атрибутной маршрутизации вместо обычной маршрутизации, подобной этой
//GET Reader/abc/Tags
[HttpGet]
[Route("Reader/{readerID}/Tags")]
public IHttpActionResult Tags(string readerID) {
//...
}