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來獲取元數據等。

 


 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.csGlobal.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.csGlobal.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM