4

私の ASP.NET Web Api (ASP.NET 4 MVC 5) アプリケーションでは、次のように構成された 2 つのルートがあります。

        // 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これらは、最初のルートに一致する「最上位」と、2 番目のルートに一致する「子」LockController(Usersフォルダ内) があるという点で、実際には非常にうまく機能します。

アプリケーションにSwashbuckle 5 ( .net 用のSwagger ) を追加したので、Swagger は混乱して、実装した各メソッドの両方のルートを表示します。例えば:

ここに画像の説明を入力

そのため、Swagger はLockControllerを最上位コントローラーと子コントローラーの両方として認識します。

特定のコントローラーがトップレベルまたは子であることを Swagger に伝えるにはどうすればよいですか?

さらに、たとえば、ロック リソースへのパスがSwagger が現在表示しているもの/api/users/{id}/lockとは異なる ことを Swagger に認識させることはできますか?/api/{parentController}/{parentId}/lock

4

2 に答える 2

1

問題は継承階層とは関係ないと思います。Swashbuckle は、すべてのルート マッピングのルートを生成します。Swashbuckle が重複したルートを生成するのを防ぐための 1 つの解決策は、コントローラーの制約をルートに追加することです。これが役立つことを願っています。

          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 に答える