Я использую атрибутную маршрутизацию в контроллере 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
, дополнительную конечную точку уходит.
Теперь осталось только определить, есть ли у нас контроллеры, которые ожидают, что эта конечная точка по умолчанию будет там.
Спасибо.