ASP.NET MVC中的ApiController和Controller之間的區別
使用Controller渲染普通檢視。 ApiController操作僅返回序列化併發送到客戶端的資料,不返回檢視。
注意如果您使用過ASP.NET MVC,那麼您已經熟悉了控制器。 它們在Web API中的工作方式類似,但Web API中的控制器派生自ApiController類而不是Controller類。 您將注意到的第一個主要區別是Web API控制器上的操作不返回檢視,它們返回資料。
ApiControllers專門用於返回資料。 例如,它們負責將資料透明地序列化為客戶端請求的格式。 此外,它們預設遵循不同的路由方案(如:將URL對映到操作),按慣例提供REST-ful API。
您可以使用Controller而不是帶有一些(?)手動編碼的ApiController來執行任何操作。 最後,兩個控制器都建立在ASP.NET基礎之上。 但是,擁有REST-ful API是如此普遍的要求,即建立WebAPI是為了簡化這種API的實現。
在兩者之間做出決定相當簡單:如果你正在編寫一個基於HTML的web / internet / intranet應用程式 - 可能偶爾會在這裡和那裡返回json的AJAX呼叫 - 堅持使用MVC / Controller。 如果要為系統提供資料驅動/ REST-ful介面,請使用WebAPI。 當然,您可以將兩者結合起來,從MVC頁面獲得ApiController來處理AJAX呼叫。
舉一個現實世界的例子:我目前正在使用ERP系統,為其實體提供REST-ful API。 對於此API,WebAPI將是一個很好的候選者。 同時,ERP系統提供了一個高度AJAX-ified的Web應用程式,您可以使用它來為REST-ful API建立查詢。 Web應用程式本身可以實現為MVC應用程式,利用WebAPI來獲取元資料等。
在兩者之間做出決定相當簡單:如果你正在編寫一個基於HTML的web / internet / intranet應用程式 - 可能偶爾會在這裡和那裡返回json的AJAX呼叫 - 堅持使用MVC / Controller。 如果要為系統提供資料驅動/ REST-ful介面,請使用WebAPI。 當然,您可以將兩者結合起來,從MVC頁面獲得ApiController來處理AJAX呼叫。 基本上控制器用於mvc和api-controller用於Rest-您可以根據需要在同一程式中使用API
Web API中的每個方法都將返回資料(JSON)而不進行序列化。
但是,為了在MVC控制器中返回JSON資料,我們將返回的Action Result型別設定為JsonResult並在物件上呼叫Json方法以確保它以JSON打包。
你寧願寫作和維護哪個?
ASP.NET MVC
public class TweetsController : Controller {
// GET: /Tweets/
[HttpGet]
public ActionResult Index() {
return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
}
}
ASP.NET Web API
public class TweetsController : ApiController { // GET: /Api/Tweets/ public List<Tweet> Get() { return Twitter.GetTweets(); } }
我喜歡ASP.NET Core的MVC6將這兩種模式合併為一種這一事實,因為我經常需要支援這兩種模式。 雖然您可以調整任何標準MVCStartup.cs
(和/或開發您自己的Global.asax.cs
類)來行動&amp; 表現得像ApiController
,它可能很難維護和測試:最重要的是,讓控制器方法返回ActionResult
與其他人混合返回原始/序列化/IHttpActionResult
資料從開發人員的角度來看可能非常混亂,特別是如果你' 不要單獨工作,需要讓其他開發人員加快這種混合方法的速度。
到目前為止,我在ASP.NET非核心Web應用程式中最小化該問題的最佳技術是將Web API包匯入(並正確配置)到基於MVC的Web應用程式中,因此我可以充分利用這兩者 世界:Startup.cs
為檢視,Global.asax.cs
為資料。
為此,您需要執行以下操作:
- 使用NuGet安裝以下Web API包:
Startup.cs
和Global.asax.cs
。 - 將一個或多個ApiControllers新增到
Startup.cs
資料夾中。 - 將以下WebApiConfig.cs檔案新增到您的
Startup.cs
資料夾:
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
最後,您需要將上述類註冊到Startup類(Startup.cs
或Global.asax.cs
,具體取決於您是否使用OWIN Startup模板)。
Startup.cs
public void Configuration(IAppBuilder app)
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ConfigureAuth(app);
// ...
}
的Global.asax.cs
protected void Application_Start()
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// ...
}
我在部落格上寫的這篇文章進一步解釋了這種方法及其優缺點。