2015-09-02 81 views
22

Trong ASP.NET 5 MVC 6 Microsoft sáp nhập lớp điều khiển MVC bình thường (Controller) với lớp điều khiển Web Api (ApiController). Bây giờ chỉ có một lớp Controller để kế thừa, bao gồm các tính năng của WebApi.Sự khác nhau giữa Bộ điều khiển MVC và Bộ điều khiển API Web trong ASP.NET MVC 6 là gì?

Vì vậy, giờ đây việc phân biệt các bộ điều khiển MVC và WebApi không đơn giản như vậy. Cả hai đều được kế thừa từ lớp Controller. Sự khác biệt duy nhất tôi có thể phát hiện là thông tin định tuyến của WebApi vẫn được cung cấp bởi các thuộc tính HttpGet, HttpPost, HttpPutHttpDelete. Nhưng bây giờ có thể làm tương tự với các bộ điều khiển MVC bằng cách sử dụng định tuyến thuộc tính, chỉ với các thuộc tính khác nhau.

Ngay cả các tính năng dường như đã hợp nhất. Bộ điều khiển MVC hỗ trợ thương lượng nội dung ngay bây giờ.

Các câu hỏi cụ thể là:

Vẫn còn sự khác biệt thực sự hay chỉ là cách các tuyến đường được chỉ định? Giờ đây, cách nào ưu tiên để tạo ứng dụng web?

(Hầu như) trống MVC điều khiển:

public class HomeController : Controller 
{ 
    public List<Person> Index() 
    { 
     return new List<Person>() 
     { 
      new Person() {Firstname = "test1", Lastname = "test2"}, 
      new Person() {Firstname = "test3", Lastname = "test4"} 
     }; 
    } 

    public IActionResult About() 
    { 
     ViewData["Message"] = "Your application description page."; 

     return View(); 
    } 

    public IActionResult Contact() 
    { 
     ViewData["Message"] = "Your contact page."; 

     return View(); 
    } 

    public IActionResult Error() 
    { 
     return View("~/Views/Shared/Error.cshtml"); 
    } 
} 

(Hầu như) có sản phẩm nào điều khiển WebAPI:

[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    // GET: api/values 
    [HttpGet] 
    public IEnumerable<Person> Get() 
    { 
     return new List<Person>() 
     { 
      new Person() {Firstname = "test1", Lastname = "test2"}, 
      new Person() {Firstname = "test3", Lastname = "test4"} 
     }; 
    } 

    // GET api/values/5 
    [HttpGet("{id}")] 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    // POST api/values 
    [HttpPost] 
    public void Post([FromBody]string value) 
    { 
    } 

    // PUT api/values/5 
    [HttpPut("{id}")] 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    // DELETE api/values/5 
    [HttpDelete("{id}")] 
    public void Delete(int id) 
    { 
    } 
} 

EDIT:

Nếu bạn muốn thử nếu đàm phán nội dung hoạt động, bạn phải đưa mã này vào phương thức Startup.ConfigureServices của bạn, bởi vì theo mặc định, kiểu trả về chỉ là JSON.

services.Configure<MvcOptions>(options => 
{ 
    options.AddXmlDataContractSerializerFormatter(); 
}); 
+0

@Will Trong MVC 6 không có lớp 'ApiController', chúng hợp nhất nó vào lớp' Controller'. Đây là chính xác những gì bạn nhận được nếu bạn tạo một bộ điều khiển WebApi với Visual Studio – Domysee

+0

Vâng, tôi đoán tôi cần phải nhìn vào MVC6:/ – Will

+0

Yea, nhiều thay đổi thú vị đã xảy ra ở đó – Domysee

Trả lời

17

Tôi nghĩ bạn đang suy nghĩ quá nhiều.

Câu hỏi đầu tiên của bạn "Sự khác biệt của Bộ điều khiển MVC và Bộ điều khiển API Web trong ASP.NET MVC 6 là gì?" giả định rằng chúng khác nhau, nhưng chúng không phải. Chúng được hợp nhất, vì vậy không có sự khác biệt.

Nếu bạn muốn xác định các tuyến đường riêng biệt để loại bỏ các phương pháp hành động không trả về Xem kết quả, hãy tiếp tục. Đó là vào bạn làm thế nào để tổ chức ứng dụng của bạn. Hỏi "Cách nào bây giờ là cách ưu tiên để tạo ứng dụng web?" là vô nghĩa, vì đó là tùy thuộc vào bạn để quyết định cho ứng dụng của bạn, và sẽ không có cách nào phổ biến hơn để làm việc cho đến sau MVC 6 đã được sử dụng trong sản xuất trong một thời gian dài.

+0

Tôi cũng nghĩ về điều đó, vẫn còn 2 mẫu khác nhau trong Visual Studio. Một cho điều khiển MVC và một cho điều khiển WebApi. Vì vậy, tôi kết luận rằng phải có sự khác biệt ở đâu đó – Domysee

+0

@Dominik Tôi nghĩ rằng kết luận của bạn không hoàn toàn được suy nghĩ. Mẫu có thể ở đó để thuận tiện, để các nhà phát triển đến từ một phiên bản cũ sẽ không bị mất khi họ muốn các tính năng Web API vào một ứng dụng MVC 6. – mason

+0

có ý nghĩa. Tôi vẫn còn một chút bối rối tại sao Microsoft sẽ bao gồm 2 cơ chế khác nhau cho cùng một điều. Đó là một phiên bản mới sau khi tất cả, vì vậy họ chỉ có thể loại bỏ một cách ủng hộ khác. – Domysee

6

Khi mason trả lời câu hỏi một cách hoàn hảo, tôi muốn cung cấp thêm một số thông tin về sự khác biệt và một số tài nguyên hy vọng sẽ giúp khách truy cập trong tương lai của câu hỏi.

Microsoft đã hợp nhất ApiControllerController thành một lớp, Controller. Để làm được điều đó, họ đã xóa một số tính năng của ApiController.

This là một bài đăng trên blog tuyệt vời mô tả các thay đổi.

Ví dụ: thay vì chỉ định tiền tố HTTP Action làm phương thức tham số và tuyến đường trong thuộc tính tuyến đường, cả hai đều được thực hiện với thuộc tính HttpGetHttpPost.

[HttpGet("api/visits")] 

Nếu bạn muốn di chuyển từ dự án WebApi, here là một số hướng dẫn để làm điều đó.

Nếu bạn không muốn di chuyển, nhưng chỉ muốn chuyển đổi dự án sang phiên bản ASP.NET MVC mới, bạn có thể sử dụng Web API Compatibility Shim. Herehere bạn tìm hướng dẫn cho điều đó.

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