Служби даних WCF (OData) проти веб-API ASP.NET


87

Я розробляю розподілену програму, яка буде складатися з сервісів RESTful та різноманітних клієнтів (Silverlight, iOS, Windows Phone 7 тощо). Зараз я визначаю, яку технологію слід використовувати для реалізації своїх служб, WCF Data Services (OData) або нового веб-API ASP.NET, який виходить з ASP.NET MVC 4.

Я переглянув кілька презентацій в Інтернеті про кожну, і зараз я схиляюсь до WCF Data Services, насамперед завдяки механізмам фільтрації, вбудованим в URI, та власній гіпермедійній можливості. Єдиний мінус, який я бачу, - це багатослівність специфікації Atom Pub на відміну від POX.

Чи є щось, що я повинен знати про ці дві технології, перш ніж приймати рішення? Чому хтось обирає веб-API ASP.NET замість служб даних WCF?

Відповіді:


31

Це суб’єктивне питання, тож ось суб’єктивна відповідь. У IMO, WCF занадто багато накладних витрат на прості послуги RESTful. Веб-API, навпаки, був розроблений спеціально для сервісів RESTful.

Я погоджуюсь з Дейвом Уордом щодо цього . Перегляньте його блог для отримання додаткової інформації.

Я довго тримався проти тиску перейти від ASMX до WCF у проектах WebForms, тому що прийняття складності WCF насамперед нагородило мене менш гнучкою серіалізацією JSON. На відміну від цього, я почав перетворювати деякі свої проекти з ASMX на Web API, і був задоволений тим, як легко веб-API замінює ASMX.

Я вважаю, що Microsoft нарешті знайшла хороший баланс між простотою ASMX і потужністю WCF за допомогою веб-API.


2
Дякую за відповідь! У мене є подальше запитання, тому, сподіваюся, ви досить добре знайомі з веб-API ASP.NET. Одне, що мені сподобалось у WCF Data Services, - це можливості гіпермедіа. Використовуючи приклад Netflix, ви можете запитати жанр фільмів, і нестандартно служба повертає посилання на кожен фільм у цьому жанрі, а не на весь запис кожного фільму. Чи можна це зробити за допомогою веб-API ASP.NET? Схоже, це дає вам всю розширену структуру об’єкта замість використання гіпермедіа.
Реймонд Сальтреллі,

Я ще не мав можливості використовувати його, але, схоже, ви можете застосувати це MediaTypeFormatterдля форматування своїх відповідей. Див. Зразок code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d .
jrummell

2
Це якась біль. Я сподівався, що буде якась конфігурація, щоб увімкнути це. І якби це відбулося автоматично. Мій бос наполягає на веб-API, тому що всі повноваження, які є в MS, підтримують це. Це все здається волею і добром. Це корисне навантаження більш стисле, ніж OData, воно має можливості запиту URI OData, у ньому просто бракує нестандартної гіпермедіа. Можливо, до часу випуску це знайде шлях туди.
Реймонд Сальтреллі 01.03.12

1
Я думаю, що цю відповідь слід переглянути ще раз, оскільки Microsoft наголошує на використанні веб-API OData над Web Api.
засновано на коді

111

В даний час існують інші основні відмінності між WebApi та WCF Data Services, про які ніхто ніколи не згадує. Я хотів би, щоб МС вийшов з гарною статтею, в якій би порівнювали ці два.

Я деякий час стежив за OData, а також за WebApi. Я завжди знаходив кілька основних відмінностей.

По-перше, я не впевнений, що ваш бос має на увазі під "MS підтримує WebApi", тобто, що вони не підтримують OData ?? ІМО, вони підтримують обидва, і в даний час існує деяке мінімальне перекриття. Ринок даних Windows Azure виставляє свої дані за допомогою OData, сховище таблиць Azure використовує OData, SharePoint 2010 дозволяє запити OData над своїми даними, а інші продукти від MS також підтримують це, наприклад Excel PowerPivot. Це дуже потужний фреймворк запитів, коли справа стосується реляційних даних. І оскільки це RESTful, будь-яка мова, фреймворк, пристрій тощо може інтегруватися з ним.

Ось що мені подобається в службах даних OData + WCF:

Служби даних OData + WCF нарешті дозволили клієнтським програмам бути більш виразними при запитах даних через Інтернет. Раніше нам завжди доводилося використовувати ASMX або WCF для створення жорстких веб-інтерфейсів, які отримують незграбність і вимагають постійних змін, коли користувальницький інтерфейс хоче щось інше. Клієнтська програма могла вказати лише параметри, які визначають, які критерії повертати. Або зробіть так, як я, і "Серіалізуйте" вираз LINQ і передайте їх як Параметри та повторно гідратуйте Expressions<Func<T,bool>>на Сервер. Це гідно. Зробив роботу, але я хочу використовувати LINQ на Клієнті і перекласти її через Інтернет за допомогою REST, що саме дозволяє OData, і я не хочу використовувати свій власний "хак" рішення.

Це як викриття "TRANSACT SQL" без необхідності рядка підключення до БД. Просто надайте url і whoala! Почніть запитувати. Звичайно, і WebApi, і WCF Data Services підтримують автентифікацію / авторизацію, тому ви можете контролювати доступ, додавати додаткові оператори "Де" на основі ролей чи іншої конфігурації даних. Я вважаю за краще робити це в моєму шарі Web Api, ніж у SQL (наприклад, будувати подання або збережені документи). І тепер, коли Програми можуть самостійно створювати запити, ви побачите спеціальні інструменти звітування та BI, які починають використовувати OData і дозволяють Користувачам визначати власні результати. Не покладаючись на статичні звіти, де вони мають мінімальний контроль.

При розробці в Silverlight, Windows 8 Metro або ASP.NET (MVC, WebForms тощо) ви можете просто додати "Посилання на послуги" у Visual Studio до служби даних WCF і швидко почати використовувати LINQ для запиту даних І ви отримаєте "Контекст даних" на Клієнті, що означає, що він відстежує зміни і дозволяє "Атомно подавати" свої зміни назад на Сервер. Це дуже схоже на Служби RIA для Silverlight. Я б використовував WCF Data Services замість RIA Services, але на той час він не підтримував DataAnnotations або Action, але зараз підтримує :) WCF Data Services має ще одну перевагу перед RIA Services, а саме можливість виконувати "Проекції" від Клієнта. Це може допомогти з підвищенням продуктивності, якщо я не хочу повертати всі властивості від сутності. Наявність "контексту даних"

Отже, WCF Data Services чудово підходить, якщо у вас є дані зі зв’язками, особливо якщо ви використовуєте SQL Server та Entity Framework. Ви швидко зможете виставити "Дані, що вимагаються" + дії (виклики для виклику операцій, тобто робочих процесів, фонових процесів) через REST з дуже невеликим кодом. Служби даних WCF щойно оновили. Запущено новий випуск. Перевірте всі нові функції.

Недоліком WCF Data Services є «контроль», який ви втрачаєте над стеком HTTP. Я знайшов найбільший недолік у IQueryable<T>Методах, які повертають Колекції. На відміну від RIA Services AND WebApi, ви НЕ маєте повного доступу для розробки логіки в методі IQueryable. У RIA Services та WebApi ви можете писати будь-який код, який хочете, доки повернетесь IQueryable<T>. У службах даних WCF ви отримуєте ЛИШЕ доступ для додавання заяви "Де" за допомогою Expression<Func<T,bool>>методів перехоплення. Я знайшов це невтішним. Наш поточний додаток використовує послуги RIA, і я вважаю, що нам дійсно потрібна можливість контролювати логіку IQueryable. Сподіваюсь, я не правий у цьому, і мені просто чогось не вистачає

Крім того, Служби передачі даних WCF поки що також не підтримують повністю всіх операторів LINQ. Однак він все ще підтримує більше, ніж WebApi.

А як щодо WebApi ???

  1. Мені подобається контроль над запитом / відповіддю Http
  2. Це легко виконувати (використовуючи шаблони MVC). Я впевнений, що з’явиться більше інструментів.

На даний момент (на моє розуміння), клієнт не підтримує "Контекст даних" (тобто Silverlight, код на стороні сервера ASP.NET тощо), оскільки WebApi насправді не стосується моделей даних сутності, таких як WCF Data Services / OData є. Він може виставляти Колекції об’єктів моделі за допомогою IQueryable / IEnumerable, але не існує первинного ключа / зовнішнього ключа «Властивості навігації» (тобто customer.Invoices) для використання після завантаження Суб’єктів на Клієнта, оскільки немає «Контексту даних» який завантажує їх асинхронно (або в одному дзвінку за допомогою $ expand) та керує змінами. У вас немає генерованого кодом "представлення" вашої моделі даних сутності на клієнті, як у RIA Services або WCF Data Services. Я не кажу, що ви не можете / не маєте моделей у клієнті, які представляють ваші дані, але ви вручну заповнюєте Дані та керуєте тим, які "рахунки-фактури" слід встановлювати кожному "клієнту" після їх отримання через Інтернет. Це може бути складно, особливо з усіма матеріалами Async. Ви не знаєте, які дзвінки повернуться першими. Це може бути важко пояснити тут, але просто прочитайте про "Контекст даних" у RIA Services абоСлужби даних WCF . Отже, коли я маю справу з додатками для бізнесу, це є головним питанням для мене. Це в основному базується на продуктивності та ремонтопридатності. Ви можете спокійно створювати додатки без контексту даних. Це просто полегшує роботу, особливо в Silverlight, WPF і тепер Windows 8 Metro. Наявність реляційних сутностей, завантажених в пам’ять, асинхронно та наявність двох прив’язок - це дійсно приємно мати.

Сказавши це, чи означає це, що колись WebApi може підтримувати "Контекст даних" на Клієнті? Я думаю, що могло. Крім того, завдяки більшій кількості інструментів, проект Visual Studio може генерувати всі ваші методи CRUD на основі схеми бази даних (або Entity Framework).

Крім того, я знаю, що згадую лише .NET до .NET Frameworks, коли справа стосується роботи з WCF Data Services або WebApi, але я прекрасно усвідомлюю, що HTML / JS також є головним гравцем. Я просто згадував про переваги, які я виявив, маючи справу з інтерфейсом Silverlight, або кодом на стороні сервера ASP.NET тощо. Я вважаю, що з появою "IndexedDB" у HTML5 / JavaScript, що має "Контекст даних" та Фреймворк LINQ у JavaScript також може стати доступним, що робить можливість запиту служб OData ще простішою з JavaScript (ви можете використовувати DataJS сьогодні з OData). Крім того, використання KnockoutJS для підтримки MVVM та Binding в HTML / JS також зробить це легким :)

Зараз я досліджую, яку платформу використовувати. Я був би радий використовувати будь-яку з них, але я схиляюся до OData, виходячи з того, що моя наступна Програма стосується переважно Analytics (лише для читання), і я хочу насичений виразний RESTful Api. Я вважаю, що OData + WCF Data Services дають мені це, оскільки WebApi підтримує лише $ take, $ skip, $ filter, $ orderby над колекціями. Він НЕ підтримує Проекції, Включає ($ розширити) і т. Д. У мене не так багато "Оновлення / Видалення / Вставки", і наші Дані досить реляційні.

Сподіваюсь, інші люди приєднаються до обговорення та висловлять свої думки. Я все ще приймаю рішення і хотів би почути інші думки. Я справді думаю, що обидва ці рамки є чудовими. Цікаво, якщо вам навіть доводиться вибирати, чому б не використовувати обидва, якщо це потрібно. Від Клієнта все одно полягає у створенні дзвінків REST. Просто думка :)


4
Web Api має новий попередній перегляд підтримки OData, який додає відсутні відмінні риси та ставить його на тій самій основі, що і WCF DS: [посилання] [ blogs.msdn.com/b/alexj/archive/2012/08/15/…
Йоханнес Rudolph

@JohannesRudolph - посилання, яке ви дали, звучить цікаво, але порушено.
Оллі,

Добре, думаю, це просто проблема форматування. Це має бути: blogs.msdn.com/b/alexj/archive/2012/08/15/… .
Оллі,

Web Api також просто потрібна ця маленька любов для роботи над версіями Excel до 2013 року: aspnetwebstack.codeplex.com/workitem/820
David d C e Freitas,

5
Як і в 2014 році, Microsoft має цікавий допис у блозі blogs.msdn.com/b/odatateam/archive/2014/03/27/…, щоб обговорити майбутнє підтримки OData від WCF та WebApi.
hardywang

26

Ми вважаємо, що веб-API надає правильну платформу для служб OData в майбутньому, і як такий буде інвестувати в основному в цю платформу для серверних стеків OData. Звичайно, ми продовжуватимемо вкладати значні ресурси в основні бібліотеки та клієнта OData, але ми плануємо зменшити інвестиції в WCF Data Services як стек для створення служб OData.

Блог команди OData

Отже, здається, зараз все досить ясно


16

І Web API, і WCF Data Services підтримують OData нестандартно. З WCF Data Services (WCFDS) це автоматично. За допомогою Web API поверніться IQueryableз контролера і позначте метод методом [Queryable]. Це дасть вам $filterфункціональність, про яку ви говорили. І якщо ви підете таким чином, обидва можуть обробляти JSON у відповіді автоматично, вставивши accept=application/jsonзаголовок запиту. OData від WCFDS підтримує кілька ключових слів OData, ніж веб-API (хоча $expandна думку спадає лише ключове слово), але я впевнений, що час це виправить.

Як клієнти .NET, так і HTML-сторінки можуть легко використовувати обидві ці альтернативи, але якщо вам подобається LINQ і ви створюєте клієнти .NET, WCFDS може бути доданий до вашого проекту як посилання на службу. Це дозволяє взагалі пропустити всі справи HTTP і безпосередньо запитувати колекції.

Суть в тому, що ніщо не заважає вам розміщувати .svc-файли у своєму проекті ASP.Net MVC. Це не пропозиція або-або. Додавання служб передачі даних на ваш сервер позбавить вас від необхідності писати багато контролерів, але не заважає вам писати додаткові контролери, якщо хочете.


6

Іншими словами :

Якщо ви хочете швидко розкрити модель даних (EDM чи інше) і вам не потрібно багато коду або бізнес-логіки, WCF Data Services робить це ДІЙСНО простішим і буде гарною відправною точкою.

Якщо ви створюєте API і просто хочете розкрити деякі ресурси (і логіку), використовуючи синтаксис запиту OData або форматування, тоді веб-API ASP.NET , мабуть, найкраще місце для початку.

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


5

Деварон дав найбільш інформативний огляд WCF проти Web Api, який я ще не знайшов. Дякую. Тепер, якщо WCF занадто складний, я скажу, що складність не є автоматично негативною. Ви будете вдячні за дихальну кімнату, яку вона вам надасть у майбутньому. Завдання, як завжди, з інструментами Microsoft полягає в тому, що ми не знаємо і не контролюємо це майбутнє. Будемо сподіватися, що в кінцевому підсумку Microsoft отримає більш уніфіковану систему і залишиться на кілька років.

У мене також є велика система для побудови, і це підкреслює мене, що шлях не є більш чітким. Я планую затриматися ще на пару місяців, поки все це вирішиться. І особисто я вболіваю за datajs (також перевірте JayData)


1

Просто найпростішими словами, відійдіть від базового протоколу і подивіться на це з точки зору розробника / користувача. Веб-API - це перший клас Microsoft Rest Framework на базі HTTP, а не WCF. Це означає, що будь-які відсутні функції та характеристики Rest, які вони збираються додати до каналу веб-API, а не обов’язково до WCF.

Так, ви можете реалізувати їх самостійно у WCF, але, як сказано в реченні, вам потрібно реалізувати їх самостійно.

Подібно до того, як сьогодні приклад реалізації двофакторної автентифікації для веб-API займає менше 15 хвилин за допомогою OWIN, який є насамперед пакетом автентифікації / авторизації, який розпочався як проект з відкритим кодом.

Коли ви використовуєте стек технологій, дуже важливо використовувати стек першого класу для Microsoft. Ви б навіть мали незліченну кількість опублікованих зразків коду та проектів MS у Github, які ви можете просто скопіювати та зробити фору у своєму власному проекті. Це має різницю на кожному рівні, документація, зразки коду, набір функцій, підтримка, допоміжні програми, як ви це називаєте.

Тож моя проста порада вам, якщо ви хочете створювати додатки на базі Restfull HTTP, використовуйте веб-API (або ASP.NET Core для переносимості) і справді тримайтеся подалі від WCF. Якщо протокол не є HTTP і він насправді не може бути HTTP, використовуйте WCF.


0

Це TL; DR відповідь на це питання.

WCF - це швейцарський армійський ніж до викрутки WEB API для передачі та передачі даних: WCF може робити все, що може зробити WEB API, але, якщо вам потрібно більше (наприклад, за допомогою протоколу TCP), WCF - це шлях.

Ось чудове порівняння .

WEB API

Причиною номер один для використання WEB API є те, що він легкий. Це означає, що він простіший у впровадженні, легший у навчанні, простіший в обслуговуванні тощо. Він спеціально розроблений для Інтернету, який потребує RESTful веб-служб через HTTP. Це робить і робить це добре. Якщо це все, що вам потрібно, WEB API - це, мабуть, шлях.

Крім того, це відкритий код (якщо вам все одно)

WCF

WCF просто робить набагато більше, ніж WEB API: він підтримує кілька протоколів передачі, декілька шаблонів обміну (WEB API вимагає інтеграції з SignalR або Web Sockets), служби SOAP можуть бути описані в WSDL, має додаткові функції безпеки тощо. Якщо вам потрібна ця додаткова функція, скористайтесь WCF.

OData

OData - це просто

Відкритий протокол, що дозволяє створювати та використовувати споживані та сумісні RESTful API просто і стандартно. джерело: http://www.odata.org/

Іншими словами, високий рівень, це просто стандартизація конкретної граматики для RESTful HTTP-запитів. Що забезпечить ті самі переваги, що й будь-який протокол. І принаймні з 2013 року як WCF, так і WEB API дозволяють використовувати OData. Тож, мабуть, не варто турбуватися про OData.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.