Как не генерировать конечные точки по умолчанию при использовании маршрутизации атрибутов? - PullRequest
0 голосов
/ 10 января 2020

Я использую атрибутную маршрутизацию в контроллере Web API (. NET Framework 4.5.2 - не спрашиваю, я пытаюсь получить одобрение на время, чтобы все продвинуть вперед).

Я применил атрибут [RoutePrefix] к своему ApiController.

У меня есть два действия контроллера, оба HttpGets. К каждому приложен атрибут [Route].

Я использую Swagger для автоматической генерации документов. В документации по этому контроллеру я вижу три конечные точки - две для моих действий контроллера и еще один HttpGet с маршрутом чистого контроллера.

Вот что у меня есть:

[RoutePrefix("api/test/Tickets")]
public class TestTicketsController : ApiController
{
    [HttpGet, Route("")]
    public HttpResponseMessage GetTickets()
    {
        ....
    }
    [HttpGet, Route("since")]
    public HttpResponseMessage GetTicketsSince(string since)
    {
        ....
    }
}

И в сгенерированных документах Swagger я вижу три конечные точки:

  • GET api / test / Tickets
  • GET api / test / Tickets / начиная с
  • GET api / TestTickets

Эта третья конечная точка, api/TestTickets, похоже, получена из имени класса контроллера, игнорируя мои атрибуты маршрутизации. И когда я вызываю его, я получаю HTTP 200 с пустым телом, несмотря на то, что не определил для него действие.

Откуда это происходит? И как я могу остановить его создание?

===

Было предложено удалить атрибут [HttpGet, Route("")]. Если я это сделаю, я получу ошибку:

 Multiple operations with path 'api/TestTickets' and method 'GET'.

Было также предложено включить мой WebApiConfig:

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

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "swagger_root",
            routeTemplate: "",
            defaults: null,
            constraints: null,
            handler: new RedirectHandler((message => message.RequestUri.ToString()), "api/docs/index"));

        var mediaType = new MediaTypeHeaderValue("application/json");

        var formatter = new JsonMediaTypeFormatter();
        formatter.SupportedMediaTypes.Clear();
        formatter.SupportedMediaTypes.Add(mediaType);

        config.Formatters.Clear();
        config.Formatters.Add(formatter);

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

Если я закомментирую config.Routes.MapHttpRoute, дополнительную конечную точку уходит.

Теперь осталось только определить, есть ли у нас контроллеры, которые ожидают, что эта конечная точка по умолчанию будет там.

Спасибо.

1 Ответ

0 голосов
/ 19 марта 2020

abdulg указано в комментарии, а не в ответе - маршруты по умолчанию настраиваются в WebApiConfig.

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