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 被嵌套控制器混淆的主要内容,如果未能解决你的问题,请参考以下文章

Web 表单中的 ASP.NET Web Api

如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?

ASP.NET Web API中的参数绑定总结

Web API系列教程2.2 — ASP.NET Web API中的路由和动作选择机制

ASP.NET Web API 与 ASP.NET Core 中的 URL 匹配差异

ASP.NET 5 中的 Web API 身份验证