I have done quite a lot of research into ASP.NET Web API - having a RESTful, verb-based approach as well as having a RPC, traditional approach like on ASP.NET MVC together. I am wondering what the neatest approach would be. So far I have found two that work but I am unsure what the best course of action would be.
Rationale
There is a main resource, Patient, which fit perfectly with GET, POST and PUT.
However I also have some scenarios where I have a controller with multiple actions, none that really fit in with the verb-based actions, and often multiple actions that don't have any arguments that I could implement route-based constraints (e.g. https://stackoverflow.com/a/14350711/1061602) for.
Approach 1
Multiple routes, different route name, same route template
WebApiConfig routes:
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 }
);
REF: https://stackoverflow.com/a/12367487/1061602
Downside, have to add ActionName
attribute to each action, otherwise it doesn't work (??):
[ActionName("RestApi")]
public object Get(string id)
{
...
}
[ActionName("RpcApi")]
public void Foo()
{
...
}
Approach 2
Multiple routes, same route name, different route template
WebApiConfig routes:
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 }
);
REF: http://encosia.com/rest-vs-rpc-in-asp-net-web-api-who-cares-it-does-both/
Downside being that you then have effectively 2 URLs used on the client, one for RESTful actions, one for RPC actions.
Other approaches??
??
Are there any more elegant ways of achieving this?