Маршрут веб-api не вызывается

Это моя конфигурация веб-API:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
           name: "ReaderTags",
           routeTemplate: "Reader/{readerID}/Tags"
       );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

    }
}

Я хочу, чтобы, когда я вызываю свой URL-адрес /Reader/abc/Tags, он должен вызывать действие тегов ReaderController и передавать abc в качестве строкового параметра.

Но каким-то образом он использует маршрут DefaultAPI и пытается найти abc как действие в ReaderController.

Что мне не хватает?

3
0
109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В сопоставлении маршрутов отсутствуют значения по умолчанию, которые позволили бы таблице маршрутов знать, какой контроллер и действие вызывать для маршрутов, соответствующих шаблону.

config.Routes.MapHttpRoute(
    name: "ReaderTags",
    routeTemplate: "Reader/{readerID}/Tags",
    defaults: new { controller = "Reader", action = "Tags" }
);

В шаблоне маршрута также предполагается, что строковый параметр действия имеет одно и то же имя: то есть: readerID.

public IHttpActionResult Tags(string readerID) {
    //...
}

И поскольку config.MapHttpAttributeRoutes(); также настроен, то же самое можно достичь с помощью маршрутизации по атрибутам вместо маршрутизации на основе соглашений, подобной этой.

//GET Reader/abc/Tags
[HttpGet]
[Route("Reader/{readerID}/Tags")]
public IHttpActionResult Tags(string readerID) {
    //...
}

Гениальный материал

Mrug 26.10.2018 06:23

Другие вопросы по теме