使用属性路由时如何不生成默认端点?
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/test/Tickets
- GET api/test/Tickets/因为
- 获取api/TestTickets
第三个端点 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 }
);
我在 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/test/Tickets
- GET api/test/Tickets/因为
- 获取api/TestTickets
第三个端点 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 }
);