ASP.NET Web Api中的Swashbuckle被嵌套控制器搞糊涂了

时间:2016-01-05 12:55:06

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

在我的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 5Swagger for .net),Swagger很困惑地显示了我实现的每个方法的两个路由。例如:

enter image description here

所以Swagger将LockController识别为顶级控制器和子控制器。

如何告诉Swagger特定控制器是顶级控制器还是子控制器?

此外,我可以让swagger认识到锁定资源的路径,例如,正如Swagger当前显示的那样是/api/users/{id}/lock而不是/api/{parentController}/{parentId}/lock吗?

2 个答案:

答案 0 :(得分:1)

我认为问题与继承层次结构无关。 Swashbuckle为每个路由映射生成路由。为了防止Swashbuckle生成重复的路由,一个解决方案可能是为路由添加控制器约束。我希望这会有所帮助。

protected void DropPoke1_SelectedIndexChanged(object sender, EventArgs e)
    {
        imgPoke1.ImageUrl = "~/Images/HomePicture.png";
    }

答案 1 :(得分:-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