与实用程序方法相关的ApiController与Controller

时间:2013-09-19 18:04:55

标签: asp.net-mvc post asp.net-apicontroller

据我所知,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);
    }

2 个答案:

答案 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响应的主体将代表具有唯一标识符和状态的资源

  • INPROGRESS
  • 失败
  • 完整

完成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纯粹主义者可能决定点燃我并建议第二种选择。但是嘿......