1

据我了解,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);
    }
4

2 回答 2

3

Controller 是 MVC 的基类,而 ApiController 是 web api 的基类,它们可以混合使用,但应具有明确、不同的用途。如果您打算创建一个 RESTful Web 服务,我会使用 ApiController,并为您的 Web 应用程序的用户界面使用 Controller。根据您正在创建的功能,我不一定将两者混合。

例如,如果您正在为要向世界或您的应用程序公开的 API 创建 REST 服务,请将所有内容都包含在 APIController 的 Web api 集中。但是考虑在实用程序场景中使用控制器将 JSON 返回到视图。

当然,这是主观的,可能会有不同的意见。

于 2013-09-19T19:31:04.830 回答
2

正如@Brian Mains 建议的那样,在您的情况下,您应该使用 an ApiController,因为正如您所说,它不会返回视图。Controller应该用于您的 UI。

你的问题的答案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 纯粹主义者可能会因为我提出第二个选项而决定抨击并投反对票。但是嘿...

于 2013-09-19T21:30:22.963 回答