WebApi - REST& RPC组合

时间:2013-10-25 11:49:34

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

我已经对ASP.NET Web API进行了大量研究 - 拥有基于动词的RESTful方法,以及像ASP.NET MVC一样的RPC传统方法。我想知道最好的方法是什么。到目前为止,我发现有两个有效,但我不确定最佳行动方案是什么。

原理

主要资源 Patient ,完全符合GET,POST和PUT。 但是我也有一些场景,我有一个控制器有多个动作,没有一个真正适合基于动词的动作,并且通常有多个动作没有任何参数我可以实现基于路径的约束(例如{{ 3}})for。

方法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/14350711/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 }
        );

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

缺点是您在客户端上有效使用了2个URL,一个用于RESTful操作,一个用于RPC操作。

其他方法??

...

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

1 个答案:

答案 0 :(得分:2)

您是否研究过Web API 2属性路由?您可以继续在大部分应用中使用RestApi传统路径,并且如果您有不适合此模型的特殊控制器,您可以使用属性路径装饰这些控制器。

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

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