使用属性路由时如何不生成默认端点?

How do I not generate the default endpoints when using attribute routing?

我在 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 文档中我看到了三个端点:

第三个端点 api/TestTickets 似乎源自控制器的 class 名称,忽略了我的路由属性。当我调用它时,我得到了一个空主体的 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,额外的端点就会消失。

现在只需确定我们是否有任何控制器期望此默认端点存在。

谢谢。

abdulg 在评论中指出,而不是在答案中指出 - 默认路由在 WebApiConfig 中配置。

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