19

コントローラーがUsersあり、基本的な REST パターンは正常に機能しています。users/{id}/usergroupsただし、そのユーザーのすべてのユーザー グループを返す追加のパターンが 1 つ必要です。

より多くのコントローラーで同様のルートが必要になると思うので、これを実装する最良の方法は何でしょうか。デフォルトのものだけでは十分ではありません...

エラー

要求に一致する複数のアクションが見つかりました: タイプ Api.Controllers.UsersController で Api.Models.Users.User GetUser(Int32) System.Collections.Generic.IEnumerable`1[Api.Models.Users.UserGroup] GetUserGroups(Int32) でタイプ Api.Controllers.UsersController

コード

// GET api/Users
public IEnumerable<User> GetUsers()

// GET api/Users/5
public User GetUser(int id) // THIS IS CONFLICT 1

// PUT api/Users/5
public HttpResponseMessage PutUser(int id, User user)

// POST api/Users
public HttpResponseMessage PostUser(User user)

// DELETE api/Users/5
public HttpResponseMessage DeleteUser(int id)

// GET api/Users/5/UserGroups
public IEnumerable<UserGroup> GetUserGroups(int id)  // THIS IS CONFLICT 2

編集 1

私はamhedが提案したことをしましたが、問題は解決しません。

// GET api/Users/5
[HttpGet, ActionName("getuser")]
public User GetUser(int id) // THIS STILL DOES NOT WORK

// GET api/Users/5/UserGroups
[HttpGet, ActionName("usergroups")]
public IEnumerable<UserGroup> GetUserGroups(int id) // THIS WORKS

// ROUTES
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional }
);
4

2 に答える 2

1

私はWeb API v1の使用に行き詰まっており、これに対する次の解決策を思い付きました。すべての一般的なルートについて、ActionName を「Default」として宣言します。次に、ルート構成で、デフォルトのアクションを「デフォルト」に設定します。これにより、/Users/5 への呼び出しが users/5/default に変更され、適切な場所にマップされるようになります。このソリューションで私が見つけた唯一の問題は、ドキュメントにルートの /Default 部分が表示されることです。この男が行ったように、ビューを編集してこれらを除外できるようです ( https://stackoverflow.com/a/29353198/4374666 )。

v2 を使用している場合は、属性ルーティングが最もクリーンな方法のようです。

// GET api/Users/5
[HttpGet, ActionName("Default")]
public User GetUser(int id) // THIS STILL DOES NOT WORK

// GET api/Users/5/UserGroups
[HttpGet, ActionName("usergroups")]
public IEnumerable<UserGroup> GetUserGroups(int id) // THIS WORKS

// ROUTES
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional,
 action = "Default" }
);
于 2015-11-04T22:10:44.037 に答える