Службы данных WCF (OData) и веб-API ASP.NET - PullRequest
86 голосов
/ 29 февраля 2012

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

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

Что я должен знать об этих двух технологиях, прежде чем принимать решение? Почему кто-то выбирает ASP.NET Web API вместо WCF Data Services?

Ответы [ 8 ]

110 голосов
/ 02 мая 2012

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

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

Во-первых, я не уверен, что ваш босс имеет в виду под "MS поддерживает WebApi", поскольку означает, что они не поддерживают OData ??ИМО, они поддерживают оба, и в настоящее время есть некоторое минимальное дублирование.Windows Azure Data Market предоставляет свои данные с использованием OData, хранилище таблиц Azure использует OData, SharePoint 2010 разрешает запросы OData к своим данным, и другие продукты от MS также поддерживают их, такие как Excel PowerPivot.Это очень мощная структура запросов, когда речь идет о реляционных данных.И поскольку это RESTful, любой язык, инфраструктура, устройство и т. Д. Могут интегрироваться с ним.

Вот что мне нравится в OData + WCF Data Services:

OData + WCF Data Services наконец-то позволилиКлиентские приложения должны быть более «выразительными» при запросах данных через Интернет.Раньше нам всегда приходилось использовать ASMX или WCF для создания жестких веб-API, которые становятся громоздкими и требуют постоянных изменений всякий раз, когда пользовательский интерфейс хочет что-то немного другое.Клиентское приложение может указывать только параметры, определяющие, какие критерии следует возвращать.Или делайте, как я, и «сериализуйте» выражения LINQ, передавайте их в качестве параметров и повторно вводите в Expressions<Func<T,bool>> на сервере.Это прилично.Работа выполнена, но я хочу использовать LINQ на клиенте и перевести его через Интернет с помощью REST, что и позволяет OData, и я не хочу использовать свой собственный «взлом» решения.

Это все равно, что показывать «TRANSACT SQL» без использования строки подключения к БД.Просто предоставьте URL и Whoala!Начните запрашивать.Конечно, и WebApi, и WCF Data Services поддерживают аутентификацию / авторизацию, поэтому вы можете контролировать доступ, добавлять дополнительные операторы «Где» на основе ролей или другой конфигурации данных.Я бы предпочел сделать это на уровне моего веб-интерфейса, а не на SQL (например, создание представлений или хранимых процедур).И теперь, когда приложения могут сами создавать запросы, вы увидите, что инструменты Ad-Hoc и BI Reporting начнут использовать OData и позволят пользователям определять свои собственные результаты.Не полагаясь на статические отчеты, где они имеют минимальный контроль.

При разработке в Silverlight, Windows 8 Metro или ASP.NET (MVC, WebForms и т. Д.) Вы можете просто добавить «Справочник по службам» в Visual Studio в службу данных WCF и быстро начать использовать LINQ длязапрашивать данные И вы получаете «контекст данных» на клиенте, что означает, что он отслеживает изменения и позволяет вам «отправить» ваши изменения атомарно обратно на сервер.Это очень похоже на RIA Services для Silverlight.Я бы использовал WCF Data Services вместо RIA Services, но в то время он не поддерживал DataAnnotations или Actions, но теперь это делает :) WCF Data Services имеет еще одно преимущество перед RIA Services, а именно способность выполнять «проекции».от клиента.Это может помочь с производительностью, если я не хочу возвращать все свойства от сущности.Наличие «контекста данных» на клиенте замечательно при работе с бизнес-приложениями.

Итак, службы данных WCF хороши, если у вас есть данные со связями, особенно если вы используете SQL Server и Entity Framework.Вы быстро сможете предоставлять Queryable Data + Actions (вызовы для вызова операций, т. Е. Рабочих процессов, фоновых процессов) поверх REST с очень небольшим количеством кода.Службы данных WCF были только что обновлены.Новый релиз запущен.Проверьте все новые функциональные возможности.

Недостатком WCF Data Services является «контроль», который вы теряете над стеком HTTP.Я обнаружил, что самый большой недостаток был в IQueryable<T> Методах, которые возвращают Коллекции.В отличие от RIA Services и WebApi, вы НЕ имеете полного доступа для разработки логики в методе IQueryable.В RIA Services и WebApi вы можете написать любой код, который хотите, если вы вернете IQueryable<T>.В Службах данных WCF вы ТОЛЬКО получаете доступ для добавления оператора «Где», используя методы перехвата Expression<Func<T,bool>>.Я нашел это разочаровывающим.Наше текущее приложение использует RIA Services, и я считаю, что нам действительно нужна возможность контролировать логику IQueryable.Я надеюсь, что ошибаюсь в этом, и я просто что-то упускаю

Кроме того, WCF Data Services пока еще не полностью поддерживает все операторы 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 Data Services .Поэтому, когда я имею дело с приложениями Line of Business, для меня это большая проблема.Это в основном основано на производительности и ремонтопригодности.Вы можете безоговорочно создавать приложения без контекста данных.Это просто упрощает работу, особенно в 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 Services еще проще из JavaScript (вы можете использовать DataJS сегодня с OData).Кроме того, использование KnockoutJS для поддержки MVVM и Binding в HTML / JS также сделает его быстрым:)

В настоящее время я изучаю, какую платформу использовать.Я был бы рад использовать любой из них, но я склонен склоняться к OData, основываясь на том факте, что мое следующее приложение в основном предназначено для Google Analytics (только для чтения), и я хочу богатый выразительный RESTful Api.Я считаю, что OData + WCF Data Services дает мне это, потому что WebApi поддерживает только $ take, $ skip, $ filter, $ orderby для коллекций.Он НЕ поддерживает Проекции, Включает ($ expand) и т. Д. У меня не так много «Обновлений / Удалений / Вставок», и наши Данные довольно реляционные.и высказывать свои мысли.Я все еще решаю и хотел бы услышать другие мнения.Я действительно думаю, что оба являются отличными рамками.Интересно, если вам придется выбирать, почему бы не использовать оба в случае необходимости.От Клиента это все о создании вызовов REST в любом случае.Просто мысль:)

30 голосов
/ 29 февраля 2012

Это субъективный вопрос, поэтому вот субъективный ответ. IMO, у WCF слишком много накладных расходов на простые сервисы RESTful. Web API, с другой стороны, был разработан специально для сервисов RESTful.

Я согласен с Дейвом Уордом в этом . Проверьте его блог для получения дополнительной информации.

Я долго сопротивлялся давлению, чтобы перейти от ASMX к WCF в Проекты WebForms, потому что принимать сложность WCF в первую очередь только вознаградил меня менее гибкой сериализацией JSON. В отличие от меня начал преобразовывать некоторые из моих проектов из ASMX в Web API и был доволен тем, как легко Web API заменяет ASMX.

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

26 голосов
/ 22 марта 2014

Мы считаем, что Web API обеспечивает правильную платформу для служб OData. идти вперед и в этом качестве будет инвестировать в первую очередь в эту платформу для стека серверов OData. Мы, конечно, будем продолжать вкладывать значительные ресурсы в основные библиотеки OData и клиент, но мы планируем сокращение инвестиций в службы данных WCF в качестве стека для создания OData услуги.

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

Итак, кажется, теперь все достаточно ясно

16 голосов
/ 18 июля 2012

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

Как клиенты .NET, так и HTML-страницы могут легко обращаться к обеим этим альтернативам, но если вам нравится LINQ и вы создаете клиенты .NET, WCFDS можно добавить в ваш проект в качестве ссылки на службу.Это позволяет вам вообще пропустить весь HTTP-бизнес и напрямую запрашивать коллекции.

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

6 голосов
/ 08 июля 2013

Другими словами:

Если вы хотите быстро представить модель данных (EDM или иное) и вам не нужно много кода или бизнес-логики, WCF Службы данныхделает это действительно легко и было бы хорошей отправной точкой.

Если вы создаете API и просто хотите предоставить некоторые ресурсы (и логику) с использованием синтаксиса или форматирования запроса OData, то ASP.NET Web API , вероятно, является лучшим местом дляНачните.

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

5 голосов
/ 23 июня 2012

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

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

1 голос
/ 09 сентября 2017

Просто изложите это в простейших терминах, отойдите от базового протокола и посмотрите на это с точки зрения разработчика / пользователя.Web API - это первоклассная основанная на HTTP каркас отдыха Microsoft, а не WCF.Это означает, что любые недостающие функции и спецификации Rest будут добавлены в канал Web API, а не обязательно в WCF.

Да, вы можете реализовать их самостоятельно в WCF, но, как сказано в предложении, вам нужно реализовать этисам.

Так же, как пример сегодня, реализация двухфакторной аутентификации для веб-API занимает менее 15 минут с использованием OWIN, который является главным образом пакетом аутентификации / авторизации, запущенным как проект с открытым исходным кодом.

Когда вы используете технологический стек, очень важно использовать стек первого класса для Microsoft.Вы бы даже имели на Github бесчисленное множество примеров кода и проектов, опубликованных MS, которые вы можете просто скопировать и начать работу в своем собственном проекте.Это имеет значение на каждом уровне: документация, примеры кода, набор функций, поддержка, вспомогательные API, которые вы называете.

Итак, мой простой совет, если вы хотите создавать приложения Restfull HTTP на основе HTTP, используйте веб-API (или ASP.NET Core для переносимости) и действительно держитесь подальше от WCF.Если протокол не HTTP и действительно не может быть HTTP, используйте WCF.

0 голосов
/ 17 июня 2016

Это ответ TL; DR на этот вопрос.

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

Вот отличное сравнение 1006 *.

WEB API

Основная причина использования WEB API в том, что он легкий. Это означает, что его проще реализовать, легче изучать, легче поддерживать и т. Д. Он специально разработан для Интернета, которому требуются веб-службы RESTful через HTTP. Это делает это, и это делает это хорошо. Если это все, что вам нужно, вероятно, стоит использовать WEB API.

Кроме того, это с открытым исходным кодом (если вам интересно)

WCF

WCF делает намного больше, чем веб-API: он поддерживает несколько протоколов передачи, несколько шаблонов обмена (веб-API требует интеграции с SignalR или веб-сокетами), службы SOAP можно описать в WSDL, имеют дополнительные функции безопасности и многое другое. Пойдите с WCF, если вам требуется эта дополнительная функциональность.

OData

OData это просто

Открытый протокол, позволяющий создавать и использовать запрашиваемые и совместимые API-интерфейсы RESTful простым и стандартным способом. источник: http://www.odata.org/

Другими словами, высокий уровень - это просто стандартизация определенной грамматики для запросов HTTP RESTful. Который обеспечит те же преимущества, что и любой протокол. По крайней мере, с 2013 года WCF и WEB API позволяют использовать OData. Так что, вероятно, не стоит беспокоиться об OData.

...