我已经对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操作。
其他方法??
...
有没有更优雅的方法来实现这一目标?
答案 0 :(得分:2)
您是否研究过Web API 2属性路由?您可以继续在大部分应用中使用RestApi传统路径,并且如果您有不适合此模型的特殊控制器,您可以使用属性路径装饰这些控制器。
您可以查看以下尝试不同方案的WebAPI 2属性路由示例: