4

在我的 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而不是 /api/{parentController}/{parentId}/lockSwagger 当前显示的路径?

4

2 回答 2

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" }

        );
于 2016-01-07T08:15:00.240 回答
-1

我认为这应该工作 -

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
于 2016-01-05T13:54:14.430 回答