1. 程式人生 > 其它 >ASP.NET MVC中的ApiController和Controller之間的區別

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.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);
    // ...
}

我在部落格上寫的這篇文章進一步解釋了這種方法及其優缺點。