2012-02-29 53 views
266

Tôi đã chơi xung quanh với ASP.NET MVC 4 beta và tôi thấy hai loại bộ điều khiển bây giờ: ApiControllerController.Sự khác biệt giữa ApiController và Controller trong ASP.NET MVC

Tôi hơi bối rối về những tình huống mà tôi có thể chọn một bộ điều khiển cụ thể.

Ví dụ: Nếu tôi muốn trả lại chế độ xem thì tôi đã sử dụng ApiController hoặc thông thường Controller? Tôi biết rằng WCF Web API hiện được tích hợp với MVC.

Kể từ bây giờ chúng tôi có thể sử dụng cả hai bộ điều khiển có thể ai đó xin vui lòng trỏ vào tình huống nào để đi cho bộ điều khiển tương ứng.

+5

Quan trọng: ASPNET Core đã 'hợp nhất' 'ApiController' và 'Bộ điều khiển' vì vậy nếu bạn đang sử dụng .NET mới hơn, bạn không cần lo lắng về ApiController nữa - https://docs.microsoft.com/vi -us/aspnet/core/tutorials/first-web-api –

+0

Rất vui khi họ đã làm! Tôi dự đoán điều này ngược lại bằng cách http://prideparrot.com/blog/archive/2012/10/asp_net_mvc_vs_webapi – VJAI

Trả lời

273

Sử dụng Bộ điều khiển để hiển thị chế độ xem bình thường của bạn. Hành động ApiController chỉ trả về dữ liệu được tuần tự hóa và gửi tới máy khách.

here is the link

Trích:

Lưu ý Nếu bạn đã làm việc với ASP.NET MVC, sau đó bạn đã quen thuộc với các bộ điều khiển. Chúng hoạt động tương tự trong Web API, nhưng các bộ điều khiển trong Web API bắt nguồn từ lớp ApiController thay vì lớp Controller. Sự khác biệt lớn đầu tiên mà bạn sẽ thấy là các hành động trên các bộ điều khiển Web API không trả về các khung nhìn, chúng trả về dữ liệu.

ApiControllers chuyên về trả lại dữ liệu. Ví dụ, họ chăm sóc tuần tự hóa dữ liệu theo định dạng theo yêu cầu của khách hàng. Ngoài ra, chúng tuân theo một lược đồ định tuyến khác nhau theo mặc định (như trong: ánh xạ các URL tới các hành động), cung cấp một API REST-ful theo quy ước.

Bạn có thể làm bất cứ điều gì bằng cách sử dụng Bộ điều khiển thay vì một ApiController với mã số thủ công (?). Cuối cùng, cả hai bộ điều khiển đều dựa trên nền tảng ASP.NET. Nhưng việc có một API REST-ful là một yêu cầu chung ngày hôm nay mà WebAPI đã được tạo ra để đơn giản hóa việc thực hiện một API như vậy. Nó là khá đơn giản để quyết định giữa hai: nếu bạn đang viết một ứng dụng web/internet/mạng nội bộ dựa trên HTML - có thể với các cuộc gọi AJAX không thường xuyên trở lại json ở đây và ở đó - gắn bó với MVC/Bộ điều khiển. Nếu bạn muốn cung cấp một giao diện điều khiển/REST-ful dữ liệu cho một hệ thống, hãy đi với WebAPI. Bạn có thể kết hợp cả hai, tất nhiên, có một ApiController phục vụ AJAX cuộc gọi từ một trang MVC.

Để đưa ra ví dụ về thế giới thực: Tôi hiện đang làm việc với hệ thống ERP cung cấp API REST-ful cho các thực thể của nó. Đối với API này, WebAPI sẽ là một ứng cử viên tốt. Đồng thời, hệ thống ERP cung cấp một ứng dụng web AJAX-ified cao mà bạn có thể sử dụng để tạo các truy vấn cho API REST-ful. Bản thân ứng dụng web có thể được triển khai dưới dạng ứng dụng MVC, sử dụng WebAPI để tìm nạp siêu dữ liệu, v.v.

+9

Lưu ý: vì dữ liệu của bạn sẽ được gửi qua dây, nó sẽ được định dạng như thế nào? Cách dữ liệu mà một ApiController trả về được định dạng được xác định bởi thương lượng nội dung và GlobalConfiguration.Configuration.Formatters ... link: http://blogs.msdn.com/b/kiranchalla/archive/2012/02/25/content- đàm phán-in-asp-net-mvc4-web-api-beta-phần-1.aspx –

+1

Có đúng không khi nói rằng Web API là nền tảng chung cho trang web, thiết bị di động, v.v ...? và chúng ta có thể sử dụng Thư viện lớp thay vì Web API? –

+0

Cảm ơn bạn @ TimLovell-Smith vì lưu ý của bạn, bởi vì đối với tôi, Andre không trả lời câu hỏi: vì Controller cũng có thể trả về dữ liệu, nó không giải thích tại sao ApiController tồn tại và hữu ích. – JYL

140

Bạn muốn viết và duy trì cái nào hơn?

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(); 
    } 
} 
+2

Vì vậy, giải thích rất độc đáo !! Cảm ơn. – himanshupareek66

+2

Đó là một điểm tốt nhưng ApiController không chỉ là việc tuần tự hóa JSON. Nó cũng chăm sóc xem xét yêu cầu và trả về XML nếu đó là kiểu chấp nhận. –

+3

Nếu bạn sử dụng lõi asp.net, tất cả chúng đều có nguồn gốc từ lớp 'Controller'. –

16

Tôi yêu sự thật rằng MVC6 của ASP.NET Lõi sáp nhập hai mô hình thành một vì tôi thường cần phải hỗ trợ cả hai thế giới.Mặc dù bạn có thể tinh chỉnh bất kỳ tiêu chuẩn nào của MVC Controller (và/hoặc phát triển các lớp ActionResult riêng của mình) để hành động & hoạt động giống như một ApiController, có thể rất khó duy trì và kiểm tra: trên hết, có Bộ điều khiển các phương thức trả lại ActionResult được trộn lẫn với các dữ liệu khác được trả về/dữ liệu IHttpActionResult có thể rất khó hiểu từ góc độ nhà phát triển, đặc biệt là nếu bạn không làm việc một mình và cần phải đưa các nhà phát triển khác tăng tốc với phương pháp lai đó. Kỹ thuật tốt nhất mà tôi đã đi xa để giảm thiểu vấn đề đó trong các ứng dụng web ASP.NET không phải là cốt lõi là nhập (và cấu hình đúng) gói Web API vào Ứng dụng Web dựa trên MVC, vì vậy tôi có thể có tốt nhất của cả hai thế giới: Controllers cho Chế độ xem, ApiControllers cho dữ liệu.

Để làm được điều đó, bạn cần phải làm như sau:

  • Cài đặt các gói Web API sau sử dụng NuGet: Microsoft.AspNet.WebApi.CoreMicrosoft.AspNet.WebApi.WebHost.
  • Thêm một hoặc nhiều ApiControllers vào thư mục /Controllers/ của bạn.
  • Thêm WebApiConfig.cs sau tập tin vào thư mục /App_Config/ của bạn:

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

Cuối cùng, bạn sẽ cần phải đăng ký lớp ở trên để Startup lớp học của bạn (hoặc Startup.cs hoặc Global.asax.cs, tùy thuộc vào việc bạn đang sử dụng mẫu Khởi động OWIN hay không).

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

Cách tiếp cận này - cùng với những ưu và khuyết điểm của nó - được giải thích thêm trong the following post.

1

Mọi phương pháp trong API Web sẽ trả về dữ liệu (JSON) mà không cần tuần tự hóa. Tuy nhiên, để trả về dữ liệu JSON trong bộ điều khiển MVC, chúng ta sẽ đặt kiểu kết quả hành động trả về thành JsonResult và gọi phương thức Json trên đối tượng của chúng ta để đảm bảo nó được đóng gói trong JSON.

Các vấn đề liên quan