4

私は ASP.NET Web API についてかなり多くの調査を行ってきました。RESTful な動詞ベースのアプローチと、ASP.NET MVC のような従来の RPC アプローチを一緒に使用しています。私は最もきちんとしたアプローチが何であるか疑問に思っています。これまでのところ、うまくいくものを 2 つ見つけましたが、最善の行動方針が何であるかはわかりません。

根拠

GET、POST、および PUT に完全に適合する主要なリソースであるPatientがあります。ただし、複数のアクションを持つコントローラーがあり、動詞ベースのアクションに実際に適合するものはなく、多くの場合、ルートベースの制約を実装できる引数を持たない複数のアクションがあるシナリオもあります (例: https: //stackoverflow.com/a/14350711/1061602 ) の場合。

アプローチ1

複数のルート、異なるルート、同じルートテンプレート

WebApiConfig ルート:

        config.Routes.MapHttpRoute(
            name: "RestApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );


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

参照: https://stackoverflow.com/a/12367487/1061602

欠点は、各アクションに属性を追加する必要があることActionNameです。そうしないと機能しません (??):

    [ActionName("RestApi")]
    public object Get(string id)
    {
        ...
    }

    [ActionName("RpcApi")]
    public void Foo()
    {
        ...
    }

アプローチ 2

複数のルート、同じルート、異なるルートテンプレート

WebApiConfig ルート:

        config.Routes.MapHttpRoute(
            name: "RestApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

参照: http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/

欠点は、クライアントで事実上 2 つの URL が使用されることです。1 つは RESTful アクション用、もう 1 つは RPC アクション用です。

他のアプローチ??

??

これを達成するためのよりエレガントな方法はありますか?

4

1 に答える 1

2

Web API 2 属性ルーティングを調べましたか? ほとんどのアプリケーションでRestApiの従来のルートを使用し続けることができ、このモデルに適合しない特別なコントローラーがある場合は、それらのコントローラーを属性ルートで装飾できます。

さまざまなシナリオを試す次の WebAPI 2 属性ルーティング サンプルをご覧ください。

http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/WebApiAttributeRoutingSample/Readme.txt

于 2013-10-25T12:00:14.383 に答える