Dịch vụ dữ liệu WCF (OData) Vs ASP.NET Web API


87

Tôi đang thiết kế một ứng dụng phân tán bao gồm các dịch vụ RESTful và nhiều ứng dụng khách khác nhau (Silverlight, iOS, Windows Phone 7, v.v.). Ngay bây giờ, tôi đang xác định công nghệ nào tôi nên sử dụng để triển khai các dịch vụ của mình, Dịch vụ dữ liệu WCF (OData) hoặc API Web ASP.NET mới sắp ra mắt với ASP.NET MVC 4.

Tôi đã xem một vài bài thuyết trình trực tuyến về từng loại và ngay bây giờ tôi đang nghiêng về Dịch vụ Dữ liệu WCF chủ yếu vì các cơ chế lọc được tích hợp trong URI và khả năng siêu phương tiện gốc. Nhược điểm duy nhất tôi có thể thấy là tính chi tiết của đặc tả Atom Pub trái ngược với POX.

Có điều gì tôi nên biết về hai công nghệ này trước khi đưa ra quyết định không? Tại sao ai đó lại chọn ASP.NET Web API thay vì WCF Data Services?

Câu trả lời:


31

Đây là một câu hỏi chủ quan, vì vậy đây là một câu trả lời chủ quan. IMO, WCF có quá nhiều chi phí cho các dịch vụ RESTful đơn giản. Mặt khác, Web API được thiết kế đặc biệt cho các dịch vụ RESTful.

Tôi đồng ý với Dave Ward về điều này . Kiểm tra blog của anh ấy để biết thêm thông tin.

Từ lâu, tôi đã cố gắng chống lại áp lực chuyển từ ASMX sang WCF trong các dự án WebForms, vì việc chấp nhận sự phức tạp của WCF chủ yếu chỉ giúp tôi tuần tự hóa JSON kém linh hoạt hơn. Ngược lại, tôi đã bắt đầu chuyển đổi một số dự án của mình từ ASMX sang Web API và rất hài lòng với việc Web API thay thế ASMX dễ dàng như thế nào.

Tôi tin rằng Microsoft cuối cùng đã tìm thấy sự cân bằng tốt giữa tính đơn giản của ASMX và sức mạnh của WCF với API Web.


2
Cảm ơn vì câu trả lời! Tôi có một câu hỏi tiếp theo vì vậy tôi hy vọng bạn đã khá quen thuộc với ASP.NET Web API. Một điều tôi thích về Dịch vụ Dữ liệu WCF là khả năng siêu đa phương tiện. Sử dụng ví dụ Netflix của họ, bạn có thể truy vấn một thể loại phim và dịch vụ sẽ trả về liên kết đến từng phim trong thể loại đó thay vì toàn bộ mục nhập cho từng phim. Có cách nào để làm điều đó với API Web ASP.NET không? Có vẻ như nó cung cấp cho bạn toàn bộ cấu trúc đối tượng được mở rộng thay vì sử dụng siêu phương tiện.
Raymond Saltrelli

Tôi chưa có cơ hội sử dụng nó, nhưng có vẻ như bạn có thể triển khai MediaTypeFormatterđể định dạng câu trả lời của mình. Xem code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d để biết mẫu.
jrummell

2
Đó là một nỗi đau. Tôi đã hy vọng sẽ có một số loại cấu hình để bật điều đó. Và nếu sẽ xảy ra một cách tự động. Sếp của tôi đang thúc đẩy Web API vì tất cả các quyền lực ở MS đều ủng hộ nó. Tất cả có vẻ như ý và tốt. Trọng tải của nó ngắn gọn hơn OData, nó có khả năng truy vấn URI của OData, nó chỉ thiếu siêu phương tiện độc đáo. Có lẽ nó sẽ tìm thấy nó ở đó vào thời gian phát hành.
Raymond Saltrelli

1
Tôi nghĩ câu trả lời này nên được xem xét lại vì Microsoft đang nhấn mạnh sử dụng API Web OData trên Web Api.

111

Hiện tại có những khác biệt lớn khác giữa Dịch vụ dữ liệu WebApi và WCF mà dường như chưa ai đề cập đến. Tôi ước MS sẽ ra một bài báo hay so sánh hai loại này.

Tôi đã theo dõi OData một thời gian và cả WebApi. Tôi luôn tìm thấy một vài điểm khác biệt chính.

Đầu tiên, tôi không chắc sếp của bạn nói gì khi nói "MS đang ủng hộ WebApi", có nghĩa là họ không ủng hộ OData ?? IMO, họ đang ủng hộ cả hai và hiện tại có một số chồng chéo tối thiểu. Windows Azure Data Market hiển thị Dữ liệu của họ bằng OData, Azure Table Storage sử dụng OData, SharePoint 2010 cho phép Truy vấn OData trên Dữ liệu của nó và các Sản phẩm khác từ MS cũng đang hỗ trợ nó, chẳng hạn như Excel PowerPivot. Đó là một khung truy vấn rất mạnh khi nói đến Dữ liệu quan hệ. Và bởi vì nó RESTful, bất kỳ ngôn ngữ, khuôn khổ, thiết bị nào, v.v. đều có thể tích hợp với nó.

Đây là những gì tôi thích về Dịch vụ dữ liệu OData + WCF:

Dịch vụ Dữ liệu OData + WCF cuối cùng đã cho phép Ứng dụng Khách "biểu đạt" hơn khi truy vấn Dữ liệu qua Web. Trước đây, chúng ta luôn phải sử dụng ASMX hoặc WCF để xây dựng các API Web cứng nhắc, khó sử dụng và yêu cầu thay đổi liên tục bất cứ khi nào giao diện người dùng muốn một thứ gì đó hơi khác. Ứng dụng Máy khách chỉ có thể chỉ định các tham số để chỉ định tiêu chí trả về. Hoặc làm như tôi đã làm và "Tuần tự hóa" Biểu thức LINQ và chuyển chúng dưới dạng Tham số và tái hydrat hóa vào Expressions<Func<T,bool>>trên Máy chủ. Nó khá. Đã hoàn thành công việc, nhưng tôi muốn sử dụng LINQ trên Máy khách và nó đã được dịch qua Web bằng REST, đó là chính xác những gì OData cho phép và tôi không muốn sử dụng giải pháp "hack" của riêng mình.

Nó giống như việc hiển thị "TRANSACT SQL" mà không cần đến Chuỗi kết nối DB. Đơn giản chỉ cần cung cấp một Url và whoala! Bắt đầu truy vấn. Tất nhiên, cả Dịch vụ Dữ liệu WebApi và WCF đều hỗ trợ Xác thực / Cấp quyền, vì vậy bạn có thể kiểm soát quyền truy cập, nối thêm các câu lệnh "Where" dựa trên vai trò hoặc cấu hình dữ liệu khác. Tôi muốn làm điều này trong Lớp Api Web của mình hơn là trong SQL (như xây dựng Chế độ xem hoặc Procs được lưu trữ). Và bây giờ Ứng dụng có thể tự tạo truy vấn, bạn sẽ thấy các công cụ Báo cáo Ad-Hoc và BI bắt đầu tận dụng OData và cho phép Người dùng xác định kết quả của riêng họ. Không dựa vào Báo cáo tĩnh khi chúng có quyền kiểm soát tối thiểu.

Khi phát triển trong Silverlight, Windows 8 Metro hoặc ASP.NET (MVC, WebForms, v.v.), bạn có thể chỉ cần thêm "Tham chiếu Dịch vụ" trong Visual Studio vào Dịch vụ Dữ liệu WCF và nhanh chóng bắt đầu sử dụng LINQ để truy vấn Dữ liệu VÀ bạn nhận được một "Ngữ cảnh dữ liệu" trên Máy khách, có nghĩa là nó theo dõi các thay đổi và cho phép bạn "Gửi" các thay đổi của mình trở lại Máy chủ một cách nguyên tử. Điều này rất giống với Dịch vụ RIA cho Silverlight. Tôi lẽ ra đã sử dụng Dịch vụ dữ liệu WCF thay vì Dịch vụ RIA, nhưng tại thời điểm đó, nó không hỗ trợ DataAnnotations hoặc Actions, nhưng bây giờ thì có :) Dịch vụ dữ liệu WCF có một lợi thế khác so với Dịch vụ RIA, đó là khả năng thực hiện "Phép chiếu" từ Khách hàng. Điều này có thể giúp tăng hiệu suất, trong trường hợp tôi không muốn trả lại tất cả các Thuộc tính từ một Thực thể. Có "Ngữ cảnh dữ liệu"

Vì vậy, WCF Data Services rất tuyệt nếu bạn có Dữ liệu có mối quan hệ, đặc biệt nếu bạn đang sử dụng SQL Server và Entity Framework. Bạn sẽ nhanh chóng có thể hiển thị Dữ liệu có thể truy vấn + Hành động (lệnh gọi để gọi hoạt động, tức là quy trình công việc, quy trình nền) qua REST với rất ít Mã. Dịch vụ dữ liệu WCF vừa được cập nhật. Bản phát hành mới ra mắt. Kiểm tra tất cả các chức năng mới.

Nhược điểm của Dịch vụ dữ liệu WCF là bạn mất "quyền kiểm soát" đối với HTTP Stack. Tôi thấy lỗ hổng lớn nhất là trong IQueryable<T>Phương thức trả về Bộ sưu tập. Không giống như Dịch vụ RIA VÀ WebApi, bạn KHÔNG có toàn quyền truy cập để phát triển logic trong Phương pháp IQueryable. Trong Dịch vụ RIA và WebApi, bạn có thể viết bất kỳ mã nào bạn muốn miễn là bạn quay lại IQueryable<T>. Trong Dịch vụ Dữ liệu WCF, bạn CHỈ có quyền truy cập để thêm Tuyên bố "Ở đâu" bằng các Expression<Func<T,bool>>Phương thức chặn. Tôi thấy điều này thật đáng thất vọng. Ứng dụng hiện tại của chúng tôi sử dụng Dịch vụ RIA và tôi thấy chúng tôi thực sự cần khả năng kiểm soát logic IQueryable. Tôi hy vọng tôi sai về điều này và tôi chỉ thiếu một cái gì đó

Ngoài ra, Dịch vụ Dữ liệu WCF cũng KHÔNG hỗ trợ đầy đủ cho tất cả các Nhà khai thác LINQ. Tuy nhiên, nó vẫn hỗ trợ nhiều hơn WebApi.

Còn WebApi thì sao ???

  1. Tôi thích quyền kiểm soát đối với Yêu cầu / Phản hồi Http
  2. Thật dễ dàng để làm theo (tận dụng các mẫu MVC). Tôi chắc rằng sẽ có nhiều công cụ hơn.

Hiện tại (theo sự hiểu biết của tôi), không có hỗ trợ "Ngữ cảnh dữ liệu" trên Máy khách (tức là Silverlight, Mã phía máy chủ ASP.NET, v.v.), vì WebApi không thực sự về Mô hình dữ liệu thực thể như Dịch vụ dữ liệu WCF / OData Là. Nó có thể hiển thị Bộ sưu tập của các đối tượng mô hình bằng cách sử dụng IQueryable / IEnumerable, nhưng không có "Thuộc tính điều hướng" của Khóa chính / Khóa ngoại (tức là customer.Invoices) để sử dụng khi các Đối tượng được tải trên Máy khách, vì không có "Ngữ cảnh dữ liệu" tải chúng không đồng bộ (hoặc trong một lệnh gọi bằng cách sử dụng $ expand) và quản lý các thay đổi. Bạn không có "đại diện" do mã tạo mô hình dữ liệu thực thể của bạn trên Máy khách, giống như bạn làm trong Dịch vụ RIA hoặc Dịch vụ dữ liệu WCF. Tôi không nói rằng bạn không thể / không có Mô hình trong Máy khách đại diện cho Dữ liệu của bạn, nhưng bạn đã điền Dữ liệu theo cách thủ công và quản lý "hóa đơn" nào sẽ được đặt cho từng "khách hàng" sau khi họ được truy xuất qua Web. Điều này có thể trở nên phức tạp, đặc biệt là với tất cả các nội dung Async đang diễn ra. Bạn không biết cuộc gọi nào sẽ quay lại trước. Điều này có thể khó giải thích ở đây, nhưng chỉ cần đọc về nội dung "Ngữ cảnh dữ liệu" trong Dịch vụ RIA hoặcDịch vụ Dữ liệu WCF . Vì vậy, khi giao dịch với Line of Business Apps, đây là vấn đề lớn đối với tôi. Điều này chủ yếu dựa trên năng suất và khả năng bảo trì. Bạn có thể tạo Ứng dụng một cách khó hiểu mà không có Ngữ cảnh dữ liệu. Nó chỉ làm cho mọi thứ dễ dàng hơn, đặc biệt là trong Silverlight, WPF và bây giờ là Windows 8 Metro. Việc có các Thực thể quan hệ được tải vào bộ nhớ một cách không đồng bộ và có Hai ràng buộc thực sự rất hay.

Nói như vậy, điều này có nghĩa là một ngày nào đó WebApi có thể hỗ trợ "Ngữ cảnh dữ liệu" trên Máy khách? Tôi nghĩ nó có thể. Ngoài ra, với nhiều công cụ hơn, Dự án Visual Studio có thể tạo tất cả các Phương thức CRUD của bạn dựa trên Lược đồ cơ sở dữ liệu (hoặc Khung thực thể).

Ngoài ra, tôi biết rằng tôi chỉ đề cập đến .NET đến .NET Frameworks khi nói đến việc làm việc với WCF Data Services hoặc WebApi, nhưng tôi rất biết rằng HTML / JS cũng là một người chơi chính. Tôi chỉ đề cập đến những lợi ích mà tôi đã tìm thấy khi xử lý Silverlight UI hoặc ASP.NET Server-Side Code, v.v. Tôi tin rằng với sự ra đời của "IndexedDB" trong HTML5 / JavaScript sẽ có "Ngữ cảnh dữ liệu" và Khung LINQ trong JavaScript cũng có thể trở nên khả dụng, làm cho khả năng truy vấn Dịch vụ OData từ JavaScript trở nên dễ dàng hơn (bạn có thể sử dụng DataJS ngày nay với OData). Thêm vào đó, việc sử dụng KnockoutJS để hỗ trợ MVVM và Binding trong HTML / JS cũng sẽ giúp nó trở nên dễ dàng :)

Tôi hiện đang nghiên cứu nền tảng nào để sử dụng. Tôi cũng rất vui khi sử dụng, nhưng tôi có xu hướng nghiêng về OData dựa trên thực tế là Ứng dụng tiếp theo của tôi chủ yếu về Analytics (chỉ đọc) và tôi muốn có RESTful Api giàu tính biểu cảm. Tôi tin rằng Dịch vụ Dữ liệu OData + WCF mang lại cho tôi điều đó bởi vì WebApi chỉ hỗ trợ $ take, $ via, $ filter, $ orderby qua Bộ sưu tập. Nó KHÔNG hỗ trợ Phép chiếu, Bao gồm ($ expand), v.v. Tôi không có nhiều "Cập nhật / Xóa / Chèn" và Dữ liệu của chúng tôi khá liên quan.

Tôi hy vọng những người khác sẽ tham gia thảo luận và đưa ra suy nghĩ của họ. Tôi vẫn đang quyết định và rất muốn nghe những ý kiến ​​khác. Tôi thực sự nghĩ rằng cả hai đều là khuôn khổ tuyệt vời. Tôi tự hỏi nếu bạn thậm chí phải chọn, tại sao không sử dụng cả hai nếu cần. Từ Client, tất cả về việc xây dựng các cuộc gọi REST. Chỉ là một suy nghĩ :)


4
Web Api có một bản xem trước mới cho hỗ trợ OData, bổ sung những hạt đậu còn thiếu và đặt nó trên cùng nền tảng mà WCF DS sử dụng: [link] [ blogs.msdn.com/b/alexj/archive/2012/08/15/…
Johannes Rudolph

@JohannesRudolph - Liên kết bạn đưa ra nghe có vẻ thú vị nhưng đã bị hỏng.
Olly

OK, nghĩ rằng đó chỉ là vấn đề định dạng. Nó phải là: blog.msdn.com/b/alexj/archive/2012/08/15/… .
Olly

Web Api cũng chỉ cần một chút tình yêu nhỏ này để hoạt động trên các phiên bản Excel trước năm 2013: aspnetwebstack.codeplex.com/workitem/820
David d C e Freitas

5
Như chúng ta đang ở vào năm 2014, Microsoft có một bài đăng blog thú vị blog.msdn.com/b/odatateam/archive/2014/03/27/… để thảo luận về tương lai của hỗ trợ OData từ WCF và WebApi.
hardywang

26

Chúng tôi tin rằng Web API cung cấp nền tảng phù hợp cho các dịch vụ OData trong tương lai và do đó sẽ đầu tư chủ yếu vào nền tảng đó cho các ngăn xếp máy chủ OData. Tất nhiên, chúng tôi sẽ tiếp tục đưa các tài nguyên đáng kể vào thư viện lõi OData và ứng dụng khách, nhưng chúng tôi có kế hoạch giảm đầu tư vào Dịch vụ Dữ liệu WCF như một cơ sở để tạo các dịch vụ OData.

Blog Nhóm OData

Vì vậy, có vẻ như bây giờ mọi thứ đã đủ rõ ràng


16

Cả Web API và Dịch vụ dữ liệu WCF đều hỗ trợ OData ngay lập tức. Với Dịch vụ Dữ liệu WCF (WCFDS), nó tự động. Với API Web, hãy quay lại IQueryabletừ bộ điều khiển của bạn và gắn thẻ phương thức với [Queryable]. Điều này sẽ giúp bạn có được $filterchức năng mà bạn đang nói đến. Và nếu bạn làm theo cách này, cả hai đều có thể tự động xử lý JSON trong phản hồi bằng cách đưa accept=application/jsonvào tiêu đề yêu cầu. OData từ WCFDS hỗ trợ một vài từ khóa OData hơn API Web (mặc dù chỉ nghĩ đến $expandtừ khóa), nhưng tôi chắc chắn rằng thời gian sẽ khắc phục điều này.

Cả ứng dụng khách .NET và trang HTML đều có thể gọi vào cả hai lựa chọn thay thế này một cách dễ dàng, nhưng nếu bạn thích LINQ và bạn đang xây dựng ứng dụng khách .NET, WCFDS có thể được thêm vào dự án của bạn dưới dạng tham chiếu dịch vụ. Điều này cho phép bạn bỏ qua tất cả các nghiệp vụ HTTP và truy vấn trực tiếp các bộ sưu tập.

Điểm mấu chốt là không có gì ngăn cản bạn đưa tệp .svc vào dự án ASP.Net MVC của bạn. Nó không phải là một trong hai mệnh đề. Việc thêm các dịch vụ dữ liệu vào máy chủ của bạn sẽ giúp bạn không cần phải viết nhiều bộ điều khiển, nhưng không ngăn bạn viết thêm bộ điều khiển nếu muốn.


6

Nói cách khác :

Nếu bạn đang muốn hiển thị một mô hình dữ liệu (EDM hoặc cách khác) một cách nhanh chóng và không cần nhiều mã hoặc logic nghiệp vụ, Dịch vụ Dữ liệu WCF làm cho điều đó THỰC SỰ dễ dàng và sẽ là một điểm khởi đầu tốt.

Nếu bạn đang xây dựng một API và chỉ muốn hiển thị một số tài nguyên (và logic) bằng cách sử dụng định dạng hoặc cú pháp truy vấn OData, thì ASP.NET Web API có lẽ là nơi tốt nhất để bắt đầu.

http://mattmilner.com/Milner/Blog/post/2013/04/02/WCF-Data-Services-and-Web-API-with-OData;-choices-choices.aspx


5

Devaron đã đưa ra đánh giá đầy đủ thông tin nhất về WCF vs Web Api mà tôi vẫn chưa tìm thấy. Cảm ơn. Bây giờ đến mức WCF quá phức tạp, tôi sẽ nói rằng sự phức tạp không tự động là tiêu cực. Bạn sẽ biết ơn vì căn phòng thở mà nó mang lại cho bạn trong tương lai. Thách thức như mọi khi với các công cụ của Microsoft là chúng ta không biết hoặc không kiểm soát được tương lai đó. Hãy hy vọng rằng Microsoft kết thúc với một hệ thống thống nhất hơn và nó tồn tại trong một vài năm.

Tôi cũng có một hệ thống lớn cần xây dựng, và điều đó khiến tôi nhấn mạnh rằng con đường không rõ ràng hơn. Tôi dự định giữ lại vài tháng nữa trong khi mọi việc ổn thỏa. Và cá nhân tôi đang root cho datajs (cũng kiểm tra JayData)


1

Chỉ cần đặt nó theo cách đơn giản nhất, lùi lại từ giao thức cơ bản và xem xét điều này từ góc độ nhà phát triển / người dùng. Web API là Khung khôi phục dựa trên HTTP lớp đầu tiên của Microsoft không phải WCF. Điều đó có nghĩa là bất kỳ tính năng Rest, thông số kỹ thuật nào bị thiếu, chúng sẽ thêm vào đường ống API Web và không nhất thiết phải vào WCF.

Có, bạn có thể tự thực hiện những điều này trong WCF nhưng như nó đã nói trong câu, bạn cần tự thực hiện những điều này.

Cũng như một ví dụ hôm nay, việc triển khai xác thực 2 yếu tố cho API Web chỉ mất chưa đầy 15 phút bằng cách sử dụng OWIN, một gói nuget Xác thực / Cấp quyền chủ yếu bắt đầu như một dự án mã nguồn mở.

Khi bạn sử dụng ngăn xếp công nghệ, việc sử dụng ngăn xếp hạng nhất cho Microsoft sẽ tạo ra sự khác biệt rất lớn. Bạn thậm chí sẽ có vô số mã mẫu và dự án được MS xuất bản trong Github mà bạn có thể chỉ cần sao chép và bắt đầu ngay trong dự án của riêng mình. Nó tạo ra sự khác biệt ở mọi cấp độ, tài liệu, mẫu mã, bộ tính năng, hỗ trợ, api trợ giúp mà bạn đặt tên cho nó.

Vì vậy, lời khuyên đơn giản của tôi dành cho bạn, nếu bạn muốn xây dựng các ứng dụng dựa trên Restfull HTTP, hãy sử dụng API web (hoặc ASP.NET Core để có tính di động) và thực sự tránh xa WCF. Nếu giao thức không phải là HTTP và nó thực sự không thể là HTTP thì hãy sử dụng WCF.


0

Đây là câu trả lời TL; DR cho câu hỏi này.

WCF là con dao quân đội Thụy Sĩ đối với tuốc nơ vít của WEB API để giao tiếp và truyền dữ liệu: WCF có thể làm mọi thứ mà WEB API có thể làm, nhưng nếu bạn cần nhiều hơn thế (ví dụ: sử dụng giao thức TCP), WCF là một lựa chọn phù hợp.

Đây là một so sánh tuyệt vời .

API WEB

Lý do số một để sử dụng WEB API là nó nhẹ. Điều này có nghĩa là nó dễ thực hiện hơn, dễ học hơn, dễ bảo trì hơn, v.v. Nó được thiết kế đặc biệt cho Web, cần các dịch vụ web RESTful qua HTTP. Nó làm điều này và nó làm tốt. Nếu, đây là tất cả những gì bạn cần, thì WEB API có lẽ là cách tốt nhất.

Ngoài ra, nó là Mã nguồn mở (nếu bạn quan tâm)

WCF

WCF chỉ làm được nhiều điều hơn WEB API: nó hỗ trợ nhiều giao thức truyền, nhiều mẫu trao đổi (API WEB yêu cầu tích hợp với SignalR hoặc Web Sockets), dịch vụ SOAP có thể được mô tả trong WSDL, có các tính năng bảo mật bổ sung và hơn thế nữa. Sử dụng WCF nếu bạn yêu cầu chức năng bổ sung này.

OData

OData chỉ đơn giản là

Một giao thức mở cho phép tạo và sử dụng các API RESTful có thể truy vấn và tương tác theo cách đơn giản và tiêu chuẩn. nguồn: http://www.odata.org/

Nói cách khác, ở cấp độ cao, nó chỉ là tiêu chuẩn hóa một ngữ pháp cụ thể cho các yêu cầu HTTP RESTful. Điều này sẽ cung cấp các lợi ích tương tự như bất kỳ giao thức nào. Và kể từ năm 2013, cả WCF và WEB API đều cho phép sử dụng OData. Vì vậy, có lẽ không đáng lo ngại về OData.

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.