【问题标题】:WebApi - REST & RPC combinedWebApi - 结合 REST 和 RPC
【发布时间】:2013-11-04 12:35:17
【问题描述】:

我对 ASP.NET Web API 做了很多研究——有一个 RESTful、基于动词的方法以及一个 RPC、传统的方法,比如在 ASP.NET MVC 上。我想知道最整洁的方法是什么。到目前为止,我已经找到了两个可行的方法,但我不确定最好的做法是什么。

基本原理

有一个主要资源,Patient,它与 GET、POST 和 PUT 完美匹配。 然而我也有一些场景,我有一个控制器有多个动作,没有一个真正适合基于动词的动作,而且经常有多个动作没有任何参数,我可以实现基于路由的约束(例如@987654321 @) 为。

方法 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,一个用于 RESTful 操作,一个用于 RPC 操作。

其他方法??

??

有没有更优雅的方法来实现这一点?

【问题讨论】:

    标签: rest asp.net-web-api asp.net-routing


    【解决方案1】:

    您是否研究过 Web API 2 属性路由?您可以在大多数应用程序中继续使用 RestApi 常规路由,并且无论您有不适合此模型的特殊控制器,您都可以使用属性路由装饰这些控制器。

    您可以查看以下尝试不同场景的 WebAPI 2 属性路由示例:

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

    【讨论】:

    • 这似乎是一个非常有用的补充,谢谢我会看看!
    • 由于这个问题已经有很多观点,AttributeRouting 确实是要走的路。使用您的主要 RESTful 架构设置您的主要路线,然后如果您有其他人,只需使用 [Route("api/whatever")] 装饰它们
    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 2016-12-06
    • 2012-07-27
    相关资源
    最近更新 更多