Sử dụng WebAPI hoặc MVC để trả về JSON trong ASP.NET


138

Tôi đang xây dựng một ứng dụng ASP.NET MVC nặng kịch bản máy khách, nó sẽ sử dụng JSON và jQuery để thao tác DOM.

Hiểu biết của tôi là cả Web điều khiển APIMVC Controller có thể trở lại JSON.

Theo kịch bản của tôi, tôi nên sử dụng Trình điều khiển API Web hoặc Trình điều khiển MVC ?



1
Điều quan trọng cần lưu ý là câu hỏi này dành riêng cho một bối cảnh nhất định: tác giả muốn biết nên sử dụng bộ điều khiển nào nếu CHỈ json được trả về. API REST cho phép định dạng phương tiện khác nhau tùy thuộc vào đàm phán nội dung (ví dụ: chấp nhận xml, chấp nhận json). Trong trường hợp này, bộ điều khiển WebAPI là lựa chọn tốt nhất của bạn
Sentinel

Câu trả lời:


156

Bộ điều khiển API Web có thể được tạo và lưu trữ trong bất kỳ Ứng dụng ASP.NET nào, không chỉ các ứng dụng MVC. Do đó, một lý do rõ ràng để tạo API Web là nếu bạn không có giao diện người dùng MVC (ví dụ: các dịch vụ web RESTful cổ điển được lưu trữ bởi công ty / tổ chức của bạn.)

Bộ điều khiển MVC thường dựa vào Khung MVC, nếu bạn nhìn vào các mẫu mặc định và hầu hết các công việc được thực hiện bởi cộng đồng và các đồng nghiệp của bạn, bạn sẽ nhận thấy rằng hầu hết tất cả các Bộ điều khiển MVC đều được triển khai với Chế độ xem.

Cá nhân, tôi sử dụng Bộ điều khiển MVC khi tôi có ý định phản hồi với Chế độ xem () và tôi sẽ sử dụng API Web cho mọi thứ không phụ thuộc vào chế độ xem cụ thể.

Tất nhiên, có một số cảnh báo, nhưng nói chung, nếu bạn không yêu cầu hành vi Binding Model của MVC, dịch vụ của bạn là trung tâm dữ liệu và các hoạt động là trung tâm dữ liệu (ví dụ: hoạt động CRUD) thì bạn có thể muốn có 'Trình điều khiển API web 'thay vì' Bộ điều khiển xem mô hình '. Ngược lại, nếu các hoạt động của bạn là View-centric (ví dụ: cung cấp trang quản trị người dùng cho người dùng) hoặc bạn cần Binding Model của MVC để tạo ra 'ajax partials' (thì rất khó), thay vào đó bạn sẽ muốn có Trình điều khiển MVC.

Cá nhân, tôi sử dụng các bộ điều khiển API Web để điều khiển các máy khách RESTful dựa trên JSON, tôi sử dụng các bộ điều khiển MVC để xử lý việc định tuyến và phân phối trình duyệt cơ bản của SPA.


32

WebAPI là để tạo một API. Nếu bạn muốn ai đó có thể sử dụng API của mình bằng XML, JSON, v.v. Bạn có thể tạo một api web.

Trong trường hợp của bạn, bạn chỉ cần nói chuyện với khách hàng trong JSON.

Mặc dù trang web của bạn chủ yếu là tập lệnh máy khách, bạn vẫn sẽ sử dụng Trình điều khiển ASP.NET MVC phải không? Và vì bạn có thể đã phân chia hợp lý các bộ điều khiển của mình dựa trên các thực thể, nên việc thêm các phương thức phục vụ json đó vào đó trái ngược với việc tạo một lớp khác dành riêng cho api web.

Vì vậy, đối với tình huống cụ thể của bạn (nếu tôi hiểu chính xác), tôi sẽ gắn bó với Bộ điều khiển.


Cảm ơn, có sự khác biệt trong cách chúng tôi tạo WebAPI so với Trình điều khiển không?
Nil Pun

1
@flybyte có bạn cần phải xuất phát từ ApiController, xem asp.net/web-api/overview/getting-started-with-aspnet-web-api/...
Muhammad Hasan Khan

4
Web Api có thể làm JSON, cũng như các phương thức khác mà bạn liệt kê. Bộ điều khiển không thể (gọn gàng) được biến thành API, do đó, người dùng sẽ có tầm nhìn xa để hỏi - Tôi đề nghị sử dụng giải pháp linh hoạt / có thể mở rộng hơn. Nó không giống như các dịch vụ WCF cũ của trường, api web nói chung vừa mạnh mẽ vừa linh hoạt. Vì vậy, trong khi bạn chỉ cần các kịch bản đơn giản, nó nằm ngoài tầm của bạn. Hãy để bạn có sức mạnh nếu bạn cần
steve

8

Câu trả lời rút ra để phân tách các mối quan tâm, nhanh chóng tạo ra các dịch vụ và dựa vào quy ước hơn là cấu hình.

Trách nhiệm chính của bộ điều khiển là làm việc như một điều phối viên giữa chế độ xem và mô hình của bạn, nhưng trách nhiệm chính của API là làm việc trên dữ liệu. Trong trường hợp các quy ước của API, thực hiện các thao tác CRUD thực sự dễ dàng. Dưới đây là ánh xạ giữa hoạt động CRUD và các hành động HTTP

  • NHẬN: Đọc
  • BÀI: Tạo
  • PUT: Cập nhật
  • XÓA: Xóa

Vì vậy, với các API, bạn không phải tạo các hành động riêng biệt và gán chúng bằng các hành động HTTP.


0

Mối quan tâm duy nhất tôi có với ApiControll là nó dựa trên trang web không dựa trên khu vực. Một trang web chỉ có thể có một thư mục con apicontler để bạn đặt tên cho các phương thức điều khiển của mình. Có những tình huống bạn có thể muốn sao chép tên bộ điều khiển trong các khu vực khác nhau:

domain.com/api/area1/controll1/

domain.com/api/area2/controll1/

Tôi nhớ có một số cài đặt mã tùy chỉnh để có thể làm điều này nhưng nó không hoạt động theo mặc định.


Điều này có vẻ như một bình luận, không phải là một câu trả lời.
Dylan Hayes

Đừng thực sự không nói những gì bạn đang nói. Nếu bạn đặt tên cho bộ điều khiển Area1XContoder thì bạn có thể thực hiện: domain.com/Area1X/1, tạo bộ điều khiển: Area2XContoder và sau đó truy cập nó bằng: domain.com/Area2X/1. Câu hỏi lớn là tại sao bạn muốn làm điều đó anyway. Tên khu vực là trừu tượng nó không nói gì với người dùng. Nếu bạn đã cho phép nói 4 Khu vực thì tốt hơn là sử dụng tên mục đích chức năng cho nó.
Herman Van Der Blom

0

Tôi đồng ý với câu trả lời (câu trả lời hàng đầu) của Shaun Wilson nhưng không chắc tại sao vì tôi chỉ hơi bối rối và vẫn cố gắng hiểu với linh cảm (có lẽ không chính xác) sau đây -

  • Sử dụng Trình điều khiển WebAPI để phân phối dữ liệu JSON đến máy khách để máy khách có thể xử lý thao tác xem. Quá trình này KHÔNG yêu cầu một khung nhìn mà chỉ là phản hồi lại bất cứ thứ gì được gọi là phương thức (tức là yêu cầu javascript) để khách hàng có thể xử lý mọi thao tác phía máy khách.
  • Sử dụng bộ điều khiển MVC khi bạn cần sử dụng dữ liệu để thao tác chế độ xem trong hoặc ngay sau page_load (tức là không dành cho ứng dụng SPA).

Bạn thấy đấy, tôi chỉ không biết làm thế nào tôi không chính xác ở đây và bối rối vì dòng cuối cùng của câu trả lời của Shaun nói rằng "Tôi sử dụng bộ điều khiển MVC để xử lý việc định tuyến và phân phối trình duyệt cơ bản của SPA." - có lẽ tôi không hoàn toàn biết khách hàng yên tĩnh là gì khi tôi cho rằng đó có thể là phương thức JavaScript nhận được phản hồi ở dạng JSON. đây là bài đăng gần nhất trong Stackoverflow có liên quan từ xa như một câu trả lời cho câu hỏi của tôi vì vậy tôi đang trả lời bài đăng này thay vì có thể trùng lặp các câu hỏi.


" Sử dụng bộ điều khiển MVC để phân phối Chế độ xem ", bạn có thể bọc SPA thành các phần của MVC để sáng tác thành Chế độ xem. Các nhà phát triển ASP.NET MVC nên hiểu khái niệm này. Bạn có thể sử dụng các tiện ích dao cạo + ASP.NET thông thường trong quá trình tạo chế độ xem (ví dụ: xử lý phía máy chủ) để hiển thị HTML + JS cho máy khách. vấn đề mà nhiều nhà phát triển sẽ gặp phải ở đây là ý tưởng rằng các tệp HTML + JS tĩnh không phải là thứ tạo nên một SPA. đôi khi nội dung cần phải năng động và cụ thể cho người dùng, nhưng tất cả các khung có xu hướng làm mất đi thực tế này. "SPA" và "MVC" không loại trừ lẫn nhau.
Shaun Wilson

0

Trong kịch bản này, tôi muốn giới thiệu WebApi vì nó hoàn hảo để truyền dữ liệu như điều này dựa trên các yêu cầu Javascript. Tôi thường sẽ phát triển các bộ điều khiển WebApi để chúng trả về một đối tượng thân thiện JSON có thể được phân tích cú pháp dễ dàng bằng Javascript của tôi.

Thời gian thực duy nhất mà bạn muốn sử dụng một hành động trên bộ điều khiển MVC cho loại điều này sẽ là nếu bạn muốn tạo một số HTML và thay thế các phân đoạn của trang bằng các cuộc gọi Javascript.

Ví dụ:

Bạn có một Datepicker UI JQuery mà khi lựa chọn sẽ tạo ra một danh sách các nút radio đại diện cho các sự kiện vào ngày đã chọn.

Trong kịch bản này, bạn có thể sử dụng WebApi để trả về một số JSON và sau đó tạo HTML cần thiết bằng Javascript nhưng nói chung, đó là cách thực hành tồi để tạo ra nhiều HTML bằng Javascript. Sẽ tốt hơn nhiều nếu C # xây dựng HTML và sau đó trả lại thông qua chế độ xem một phần vì theo cách này bạn sẽ ít gặp phải lỗi khi phân tích cú pháp Javascript. Chưa kể nó làm cho HTML dễ viết hơn rất nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.