【问题标题】:Swashbuckle in ASP.NET Web Api confused by nested controllersASP.NET Web Api 中的 Swashbuckle 被嵌套控制器混淆
【发布时间】: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

【问题讨论】:

  • 谢谢。那正是我从那里获得路线的地方。问题是,我想继续使用这些通用路由,而不是明确提及父控制器名称的特定路由。我的目标是约定优于配置。

标签: asp.net asp.net-mvc-4 asp.net-web-api swagger swashbuckle


【解决方案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 仍然显示重复的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多