3

MapRoutingについて多くのことを学び、私が必要なことを成し遂げるために多くの時間を費やしてきたので、誰かが助けてくれることを望んでいます。:)

私は次のことをしたいと思っています:

/ api / Entities / 1 <-idが1の詳細エンティティを表示します(これは文字列であり、intではありません)

/ api / Entities / 1 /Action<-1のIDを持つエンティティで特定のアクションを呼び出します。

/ api /Entities<-エンティティセットを表示します。

/ api / Entities /Action<-エンティティセットの特定のアクションを呼び出します。

私が直面している問題は最後の問題です。idは文字列であるため、現在、最初のケースで傍受されています。

どんな援助も大歓迎です!

4

1 に答える 1

2

非常に良いリファレンスはここにあります

同じ動詞に一致する場合、RPCスタイル(アクション)とRestメソッドがうまく共存しないため、属性ベースのルーティングを使用しないと、答えはやや長くなります。お気づきのとおり、GET()とDOSOMETHING()は、同じコントローラー上で重複するメソッドシグネチャとして表示されます。これを回避するには、2つのコントローラーを使用してみてください。

したがって、属性ベースのルーティングを使用することをお勧めします。ただし、通常の方法で可能です。

標準ルーティングを使用しています...

そのようにあなたのルートを設定します

        config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        config.Routes.MapHttpRoute(
            name: "ActionDefaultApi",
            routeTemplate: "api/entities/{action}/{actionId}",
            defaults: new
                          {
                              //Add more as needed
                              action = "(|dosomething|dosomethingelse)",
                              actionId = RouteParameter.Optional,
                              controller = "EntitiesRpc"
                          });

コントローラー1:

public class EntitiesController : ApiController
{
    public string Get()
    {
        return "http://server/api/Entities";
    }

    public string Get(string id)
    {
        return string.Format("http://server/api/Entities/{0}", id);
    }
}

コントローラー2:

public class EntitiesRpcController : ApiController
{
    [HttpGet]
    public string DoSomething()
    {
        return "http://server/api/Entities/doSomething";
    }

    [HttpGet]
    public string DoSomething(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
    }

    [HttpGet]
    public string DoSomethingElse()
    {
        return "http://server/api/Entities/doSomethingelse";
    }

    [HttpGet]
    public string DoSomethingElse(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
    }
}

ここで、属性ベースのルーティングを使用したとすると、1つのコントローラーに戻って、次のようなものを使用できます。

public class EntitiesController : ApiController
{
    [Get("Entities")]
    public string Get()
    {
        return "http://server/api/Entities";
    }

    [Get("Entities/{id}")]
    public string Get(string id)
    {
        return string.Format("http://server/api/Entities/{0}", id);
    }

    [Get("Entities/doSomething")]
    public string DoSomething()
    {
        return "http://server/api/Entities/doSomething";
    }

    [Get("Entities/doSomething/{actionId}")]
    public string DoSomething(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
    }

    [Get("Entities/doSomethingelse")]
    public string DoSomethingElse()
    {
        return "http://server/api/Entities/doSomethingelse";
    }

    [Get("Entities/doSomethingelse/{actionId}")]
    public string DoSomethingElse(string actionId)
    {
        return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
    }
}
于 2012-11-30T10:21:05.037 に答える