2012-04-27 32 views
128

Tôi đang xây dựng một ứng dụng ASP.NET MVC là client-script nặng, nó sẽ sử dụng JSON và jQuery để thao tác DOM.Sử dụng WebAPI hoặc MVC để trả về JSON trong ASP.NET

hiểu biết của tôi là cả hai điều khiển API WebMVC Controller có thể trở lại JSON.

Với kịch bản của tôi, tôi có nên sử dụng Bộ điều khiển API Web hoặc Bộ điều khiển MVC không?

+0

có thể trùng lặp của [Sự khác biệt giữa ApiController và Bộ điều khiển trong ASP.NET MVC] (http: // stackoverflow.com/questions/9494966/differential-between-apicontroller-and-controller-in-asp-net-mvc) – digawp

+0

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

Trả lời

150

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. Vì vậy, một lý do rõ ràng để tạo ra một API Web là nếu bạn không có một mặt trước MVC (ví dụ như các dịch vụ web RESTful được lưu trữ bởi công ty/tổ chức của bạn.)

MVC Bộ điều khiển 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ô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 như tất cả các bộ điều khiển MVC đều được thực hiện với chế độ xem.

Cá nhân, tôi sử dụng Bộ điều khiển MVC khi tôi dự định trả lời bằng Chế độ xem() và tôi sẽ sử dụng API Web cho bất kỳ thứ gì không phụ thuộc vào một chế độ xem cụ thể. Dĩ nhiên, hãy cẩn thận nếu bạn không yêu cầu hành vi Ràng buộc mô hình 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 'Bộ điều khiển API Web' thay vì 'Bộ điều khiển kiểu xem'. Ngược lại, nếu hoạt động của bạn là Xem trung tâm (ví dụ:cung cấp một trang quản trị người dùng cho người dùng), hoặc bạn cần Model Binding của MVC để tạo ra 'partj partials' (rất khó), sau đó bạn sẽ muốn có một Controller MVC thay thế.

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

28

WebAPI là để tạo API. Nếu bạn muốn ai đó có thể tiêu thụ API của bạn bằng XML, JSON, v.v. Bạn có thể tạo api trên 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 bằng JSON.

Mặc dù trang web của bạn chủ yếu là tập lệnh của khách hàng nhưng bạn vẫn sẽ sử dụng Bộ điều khiển ASP.NET MVC phải không? Và vì bạn có thể đã phân chia một cách 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 bổ sung các phương thức phục vụ json đó vào đó là trái ngược với việc tạo ra một lớp đặc biệt cho api web.

Vì vậy, đối với trường hợp 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.

+0

Cảm ơn bạn, có sự khác biệt trong cách chúng ta tạo WebAPI vs Controller không? –

+1

@flybyte có bạn cần phải lấy được từ ApiController, xem http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api –

+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 chuyển thành một API, Vì vậy, cho người dùng có tầm nhìn xa để hỏi - Tôi khuyên bạn nên sử dụng giải pháp linh hoạt hơn. Nó không giống như các dịch vụ WCF cũ của trường, web api nói chung là mạnh mẽ và linh hoạt. Vì vậy, trong khi bạn chỉ cần các kịch bản đơn giản nó vẫn còn trên con đường của bạn. BUt bạn đã có sức mạnh nếu bạn cần nó – steve

7

Câu trả lời tóm tắt để phân tách các mối quan tâm, vặn chặt việc tạo dịch vụ và dựa vào quy ước thay vì cấu hình.

Trách nhiệm chính của bộ điều khiển là hoạt động như một điều phối viên giữa chế độ xem và mô hình của bạn nhưng khi 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 làm cho việc thực hiện các hoạt động CRUD thực sự dễ dàng. Dưới đây là các ánh xạ giữa hoạt động và HTTP hành động CRUD

  • GET: Đọc
  • POST: Tạo
  • PUT: Cập nhật
  • DELETE: Xóa

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

0

Mối quan tâm duy nhất tôi có với ApiController 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 apicontroller để 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 lặp lại tên điều khiển trong các lĩnh vực khác nhau:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

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

+0

đ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. –

+0

Không thực sự bạn đang nói gì. Nếu bạn đặt tên cho bộ điều khiển Area1XController thì bạn có thể làm: domain.com/Area1X/1, tạo một bộ điều khiển: Area2XController và sau đó truy cập nó với: domain.com/Area2X/1. Câu hỏi lớn là tại sao bạn vẫn muốn làm điều đó. 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 có cho phép nói 4 khu vực sau đó nó tốt hơn để sử dụng tên mục đích chức năng cho nó. –

0

Tôi đồng ý với (câu trả lời đầu) câu trả lời Shaun Wilson nhưng không chắc chắn lý do tại sao như tôi chỉ là một chút bối rối và vẫn đang cố gắng để hiểu như sau (có thể không chính xác) linh cảm -

  • Sử dụng WebAPI điều khiển để cung cấp JSON dữ liệu cho khách hàng để khách hàng có thể xử lý các thao tác xem. Quá trình này không yêu cầu chế độ xem mà chỉ là một phản hồi ngược lại với bất kỳ phương thức nào gọi là phương thức (tức là yêu cầu javascript) để khách hàng có thể xử lý bất kỳ thao tác phía máy khách nào.
  • 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 khi page_load (nghĩa là không dành cho ứng dụng SPA).

Bạn thấy đấy, tôi 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 "Tôi sử dụng bộ điều khiển MVC để xử lý định tuyến trình duyệt cơ bản và giao hàng SPA." - có lẽ tôi không hoàn toàn biết những gì một khách hàng yên tĩnh là khi tôi giả định nó có thể là phương pháp JavaScript nhận được một phản ứng dướ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 trả lời bài đăng này thay vì có thể sao chép các câu hỏi.

+0

"** Sử dụng bộ điều khiển MVC để cung cấp chế độ xem **", bạn có thể bọc SPA thành partials MVC để tạo 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 Razor + ASP.NET thông thường trong quá trình tạo khung (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ẽ trải nghiệm ở đây là ý tưởng rằng * tệp HTML tĩnh + JS không phải là những gì tạo SPA * 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ông tác đều có xu hướng làm giảm sự thật này. * "SPA" và "MVC" không loại trừ lẫn nhau. * –

0

Trong trường hợp này, tôi muốn giới thiệu WebApi vì nó hoàn hảo cho việc chuyển dữ liệu như vậy dựa trên 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 với JSON mà sau đó 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 tác vụ 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 JQuery UI datepicker rằng khi lựa chọn tạo ra một danh sách các nút radio mà đại diện cho các sự kiện vào ngày lựa chọn.

Trong trường hợp 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 cách sử dụng Javascript nhưng nói chung là thực tiễn không tốt để tạo nhiều HTML bằng cách sử dụng Javascript. Sẽ tốt hơn nếu C# xây dựng HTML và sau đó trả lại nó thông qua một phần xem theo cách này bạn ít có khả năng gặp lỗi với 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.

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