ASP.NET Web Api 中的 Swashbuckle 被嵌套控制器混淆
Posted
技术标签:
【中文标题】ASP.NET Web Api 中的 Swashbuckle 被嵌套控制器混淆【英文标题】:Swashbuckle in ASP.NET Web Api confused by nested controllers 【发布时间】:2016-01-05 12:55:05 【问题描述】:在我的 ASP.NET Web Api (ASP.NET 4 MVC 5) 应用程序中,我有两条路由配置如下:
// Default route. Comes "out of the box" with Web Api.
// e.g. api/users/123
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
// A route for child controllers. See for example the LockController
// that is "nested" under the "UsersController".
// e.g. api/users/123/lock
config.Routes.MapHttpRoute(
name: "ChildApi",
routeTemplate: "api/parentController/parentId/controller/id",
defaults: new id = RouteParameter.Optional
);
这些实际上工作得很好,因为我有一个与第一条路线匹配的“***”UsersController
和一个与第二条路线匹配的“子”LockController
(在Users
文件夹中) .
现在我已将Swashbuckle 5(.net 的Swagger)添加到我的应用程序中,Swagger 很困惑,无法为我实现的每种方法显示两条路线。例如:
所以 Swagger 将 LockController
识别为***控制器和子控制器。
如何告诉 Swagger 特定控制器是***控制器还是子控制器?
另外,我可以让 swagger 识别到锁资源的路径,例如,/api/users/id/lock
而不是 Swagger 当前显示的/api/parentController/parentId/lock
?
【问题讨论】:
***.com/questions/10783946/… 谢谢。那正是我从那里获得路线的地方。问题是,我想继续使用这些通用路由,而不是明确提及父控制器名称的特定路由。我的目标是约定优于配置。 【参考方案1】:我认为问题与继承层次无关。 Swashbuckle 为每个路由映射生成路由。为了防止 Swashbuckle 生成重复的路由,一种解决方案可能是向路由添加控制器约束。我希望这会有所帮助。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional ,
constraints: new controller = "Users"
);
config.Routes.MapHttpRoute(
name: "ChildApi",
routeTemplate: "api/parentController/parentId/controller/id",
defaults: new id = RouteParameter.Optional ,
constraints: new controller = "Lock"
);
【讨论】:
谢谢。绝对是前进了一步。试图思考如何以更多的约定和更少的配置来拥有这样的东西。 也许您应该编写自己的自定义约束。!?【参考方案2】:我认为这应该可行 -
config.Routes.MapHttpRoute("childapi",
"api/Parent/i/controller/action/id",
defaults: new id = RouteParameter.Optional );
适用于 -
http://localhost:60953/api/Another/1/Child/GetFlag/poo
http://localhost:60953/api/Parent/1/Child/GetFlag/poo
http://localhost:60953/api/Child/1/Another/GetString/test
【讨论】:
这显然行不通。与我在问题中提到的路线没有原则上的区别。 Swagger 仍然显示重复的方法。以上是关于ASP.NET Web Api 中的 Swashbuckle 被嵌套控制器混淆的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?
Web API系列教程2.2 — ASP.NET Web API中的路由和动作选择机制