如何在MVC4的Web API中设计非CRUD操作?

时间:2012-07-10 14:23:56

标签: c# rest asp.net-web-api

我正在使用ASP.NET MVC4和Visual Studio 2012开始一个新项目。在API设计方面,大多数示例侧重于通过实体上的PUT,GET,POST和DELETE动词进行的基本CRUD操作(如您所料)。我正在阅读以下内容:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

文章建议如果我选择将路线映射为

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

这更像是一种RPC风格的方法;从中我推断他们推荐两条带两个控制器的路由来分割每个操作:

也许类似于父实体CRUD:

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

和子实体CRUD:

routes.MapHttpRoute(
    name: "Child",
    routeTemplate: "api/user/{id}/{controller}",
    defaults: new { id = RouteParameter.Optional }
);

从数据/ crud的角度来看,这是完全有道理的。但是,如果要对实体执行非crud操作(即/User/NoahBawdy/SignIn/User/NoahBawdy/ChangePassword),该怎么办?我可以看到这些是PUT或POST动作,但它真的需要它自己的控制器吗?对于这些类型的操作来说,这是接近API设计的错误方法吗?

任何见解都会一如既往地受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

你在帖子中提出了一些有趣的观点。在我正在开发的项目中,我遇到了类似的挑战,我的方法是在路由配置上添加一个动作参数。

通过该更改,我可以向控制器添加任何方法并从客户端调用它。这样就无需为概念上属于同一控制器的方法指定多个控制器。

奥马