据我所知,ApiController是用于在资源上执行CRUD。但我有一个案例,我只是调用一些Helper方法(在SQL服务器上恢复数据库),所以我不确定ApiController是否有意义?
当我对某些内容执行CRUD时,我应该只使用ApiController吗?或者我应该将ApiController用于任何不返回视图的东西? 'post'是否使用正确的HTTP动词?我错了吗?
我想在脑海中清楚地知道何时使用其中一个。
[HttpPost]
public JsonResult RestoreBaselineDB()
{
//Get values from web.config
string sqlServer = ConfigurationManager.AppSettings["DBTools_sqlServer"];
string backupFilePath = ConfigurationManager.AppSettings["DBTools_backupFilePath"];
string destinationDatabaseName = ConfigurationManager.AppSettings["DBTools_destinationDatabaseName"];
DatabaseHelper.RestoreDatabase(sqlServer,
backupFilePath,
destinationDatabaseName,
"c:\\temp",
"ProcessManager",
"ProcessManager_log");
return Json(new
{
Status = "OK",
}, JsonRequestBehavior.AllowGet);
}
答案 0 :(得分:3)
Controller是MVC的基类,也是web api的ApiController,可以混合使用,但应该有明确的,明确的目的。如果您打算为Web应用程序的用户界面创建一个宁静的Web服务和Controller,我会使用ApiController。根据您正在创建的功能,我不一定会混合这两者。
例如,如果您要为您正在向世界或您的应用程序公开的API创建REST服务,请保留Web api APIController集中包含的所有内容。但是考虑使用Controller将JSON返回到实用程序场景中的视图。
这当然是主观的,可能会有不同的意见。
答案 1 :(得分:2)
正如@Brian Mains建议的那样,在你的情况下,你应该使用ApiController
,因为正如你所说,它不会返回视图。您的用户界面应使用Controller
。
关于你的问题的答案是ApiController
只是因为CRUD会让你危险地接近REST火焰战争。
纯REST方法是将恢复数据库操作视为创建DatabaseRestoreRequest资源(因此应该是POST)。
POST <Host>/Api/DatabaseRestoreRequest
由于恢复可能是一个冗长的操作(特别是对于大型数据库),POST响应的主体将代表具有唯一标识符和状态的资源
完成POST以启动恢复(状态为InProgress)后,您将发出GET请求,提供唯一标识符。 GET响应将提供更新状态。你可以反复调用GET,直到响应的状态为Complete。
GET <Host>/Api/DatabaseRestoreRequest/<requestID>
您可能还有DELETE操作,可能会取消还原操作。
DELETE <Host>/Api/DatabaseRestoreRequest/<requestID>
如果这看起来过于复杂和不自然,您可以使用类似于Windows Azure管理API(和其他人)使用的模式。这使用URI方案指示主URI中的资源,然后将操作指示为查询字符串参数
例如,要重新映像虚拟机,您需要执行POST操作
https://management.core.windows.net/<subscription-id>/services/hostedservices/<cloudservice-name>/deploymentslots/<deployment-slot>/roleinstances/<role-instance-name>?comp=reimage
在你的情况下,它可能类似于
POST <Host>/Api/Database?comp=restore
POST传统上用于此类操作,因为它们通常是非幂等的。幂等意味着如果你多次重复它就会产生与你只做一次相同的效果)。 PUT应该是幂等的。 POST不一定是。这来自W3C:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
REST纯粹主义者可能决定点燃我并建议第二种选择。但是嘿......