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

标签 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 风格的方法;据我推断,他们建议使用两个 Controller 的两条路线来分割每个操作:

也许类似于父实体 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 }
);

从数据/原始数据的角度来看,这是完全有道理的。但是,当您想要对实体(即 /User/NoahBawdy/SignIn/User/NoahBawdy/ChangePassword)执行非增删改查操作时该怎么办?我可以看到这些是 PUT 或 POST 操作,但它真的需要它自己的 Controller 吗?对于这些类型的操作来说,这是一种错误的 API 设计方法吗?

一如既往地感谢任何见解。

最佳答案

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

通过这一更改,我可以向 Controller 添加任何方法并从客户端调用它。这避免了为概念上属于同一 Controller 的方法指定多个 Controller 的需要。

奥马尔

关于c# - 如何在MVC4的Web API中设计非CRUD操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11415451/

相关文章:

c# - OpenQA.Selenium.DriverServiceNotFoundException

c# - 何时在 Linq 中使用 Cast() 和 Oftype()

c# - ASP.net MVC 4 只有 1 个数据库?

c# - 泛型类型值和 '==' 关键字的 'default' 运算符的行为是什么?

java - 使用 Android 设备通过 REST API 保护身份验证?

c# - 如何使用自定义属性扩展 IdentityUser

asp.net - CORS 选项预检挂起

ios - 如何在iOS中正确处理 View Controller 中的数据持久性和状态警报

rest - JAX-RS Struts2 REST API

json - 无法接受 XDomainRequest POST 到 WebAPI