3

次のコントローラーを作成しています。

public FoosController : ApiController
{
    public IQueryable Get()
    {
        return AnODataQueryableListOfFoos();
    }

    public void Delete(Guid id)
    {
        DeleteTheFooWithId(id);
    }

    public IQueryable<Bar> GetBars(Guid id)
    {
        var foo = GetFooById(id);
        return AnODataQueryableListOfBarsForThisFoo(foo);
    }

    public IEnumerable ProjectedBars(Guid id)
    {
        var foo = GetFooById(id);
        return foo.Qux
            ? OneProjectionOfBars(foo)
            : AnotherProjectionOfBars(foo);
    }
}

(バーのリストは、Foo の「コンテンツ」と考えることができます...)

次の URL を使用するつもりでした。

GET /api/Foos                         -> Get
GET /api/Foos/SOME_GUID/Bars          -> GetBars
GET /api/Foos/SOME_GUID/ProjectedBars -> GetProjectedBars
DELETE /api/Foos/SOME_GUID            -> Delete

とカスタム ルートの組み合わせをいくつか試してみました[ActionName]が、常に競合または 404 が発生しました。

これを機能させる最も簡単な方法は何ですか? 可能であれば、ルートを一般的なもの (つまり、コントローラー固有のものはありません) に保ちたいと思います。他のコントローラーは、より標準的な/StuffアプローチStuff/idを使用します。

また、私が URL を完全に悪用していることを誰かに指摘されても構いません。改善歓迎。

4

2 に答える 2

0

あなたが求めているのは n 深度のサブリソースであり、これに対する唯一の実際の解決策は、Web API の v2 で提供される属性ルーティングです。それがリリースされるまで (間もなくリリースされると思います)、RPC のようなアプローチを使用できます。

routes.MapHttpRoute("RPC", "rpc/{controller}/{id}/{action}");

これを最初の HTTP ルートとして登録し、「api」以外のプレフィックスを使用して、実際の api/ ルートと競合しないようにする必要があります。

于 2013-07-19T02:23:17.850 に答える