使用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來獲取元數據等。
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將這兩種模式合並為一種這一事實,因為我經常需要支持這兩種模式。 雖然您可以調整任何標准MVC Startup.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);
// ...
}
最大的區別就是 webapi 沒有 view
Web API是一種無限接近於RESTful風格的輕型框架,且不是微軟提出來的,微軟在.NET上實現了這中框架—Asp.Net Web API
Web API 和 MVC可以說是兩個不同的東西。Web API更傾向於基於HTTP協議的服務,直接返回用戶的數據請求。MVC是建站的一種框架,傾向於返回用戶的頁面請求。
我總結了以下 ASP.NET Web API 的特性,更能說明Web API是一種數據請求框架:
ASP.NET Web API 可以根據請求報文來返回的相應數據格式。包括JSON和XML。
ASP.NET Web API 單獨做數據請求和MVC做頁面請求可以讓Web前端和后台更好的解耦,減少開發難度。
Web API 可以更好地用在移動端網頁、桌面端網頁或者桌面程序。
Web API 的宿主可以選擇多樣:WebHost,,ConsoleHost,甚至是windows Services。
類似可以理解成ashx和webform的區別
MVC的主要使用場景在於Web站點的開發,他在后端實現了一套完整的MVC開發框架,能提供方便的頁面開發,默認使用Razor視圖引擎,提供了后端html構造,用戶可以方便地開發出帶頁面的站點。
而WebAPI主演提供了一套RestfulAPI的開發框架,提供了較為完整的http語義支持,主要用來做開放API,更抽象,更不注重View的生成。
從實現的角度看,雖然他倆捆綁在一起,但是兩者處理管線還是不同的。
Api顧名思義就是接口,MVC 控制器,數據模型,視圖,兩者最直接的區別就是視圖的區別,mvc可以直接用數據綁定到視圖上,很快的完成Ui的創建,Api主要是提供一些接口,通常用Json數據返回結果,UI視圖界面就可以多種多樣,跨站等等,跨語言等等
MVC中Controller和ApiController過濾器以及Swagger問題
MVC中的兩種控制器:
ApiController-->System.Web.Http.ApiController
Controller-->System.Web.Mvc.Controller
對應的過濾器命名空間:
ApiController--> System.Web.Http.Filters-->example: System.Web.Http.Filters.IExceptionFilter
Controller-->System.Web.Mvc-->example: System.Web.Mvc.IExceptionFilter
須對應上,否則過濾器不會生效。
Swagger問題:使用Swashbuckle不支持System.Web.Mvc.Controller
