Службы данных WCF (OData) Vs ASP.NET Web API


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

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

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

8 86

8 ответов:

это субъективный вопрос, поэтому вот субъективный ответ. ИМО, WCF имеет слишком много накладных расходов для простых услуг RESTful. Веб-API, с другой стороны, был разработан специально для RESTful services.

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

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

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

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

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

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

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

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

это похоже на предоставление "TRANSACT SQL" без необходимости строки подключения к БД. Просто укажите Url и whoala! Начинайте задавать вопросы. Конечно, как WebApi, так и Службы данных WCF поддерживают аутентификацию / авторизацию, поэтому вы можете управлять доступом, добавлять дополнительные операторы "Where" на основе ролей или другой конфигурации данных. Я бы предпочел сделать это в своем веб-Api-слое, чем в SQL (например, создание представлений или хранимых процессов). И теперь, когда приложения могут сами создавать запросы, вы увидите, что специальные и BI-инструменты отчетности начинают использовать OData и позволяют пользователям определять свои собственные результаты. Не полагаясь на статические отчеты, где они имеют минимальный контроль.

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

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

недостатком служб данных WCF является" контроль", который вы теряете над стеком HTTP. Я обнаружил, что самый большой недостаток был в IQueryable<T> методы, которые возвращают коллекции. В отличие от служб RIA и WebApi, у вас нет полного доступа для разработки логики в методе IQueryable. В службах RIA и WebApi вы можете писать любой код, который вы хотите, как долго как вы вернетесь IQueryable<T>. В службах данных WCF вы получаете доступ только к добавлению оператора "Where" с помощью Expression<Func<T,bool>> методы перехватчика. Меня это разочаровало. Наше текущее приложение использует службы RIA, и я считаю, что нам действительно нужна возможность контролировать логику IQueryable. Я надеюсь, что я ошибаюсь в этом, и я просто что-то упускаю

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

что о Веб-API???

  1. мне нравится контроль над Http-запросом / ответом
  2. легко следовать (используя шаблоны MVC). Я уверен, что больше инструментов придет.

на данный момент (насколько я понимаю), на клиенте нет поддержки "контекста данных" (т. е. Silverlight, ASP.NET серверный код и т. д.), Потому что WebApi на самом деле не относится к моделям данных сущностей, таким как WCF Data Services/OData. Он может предоставлять коллекции объектов модели с помощью IQueryable/IEnumerable, но нет первичного ключа / внешнего ключа "свойства навигации" (т. е. клиент.Счета-фактуры) для использования после загрузки сущностей на клиенте, поскольку нет "контекста данных", который загружает их асинхронно (или в одном вызове с помощью $expand) и управляет изменениями. У вас нет сгенерированного кодом "представления" вашей модели данных сущности на клиенте, как это делается в службах RIA или службах данных WCF. Я не говорю, что вы не можете/не имеете моделей в клиенте, которые представляют ваши данные, но у вас есть вручную заполнить данные и управлять, какие "счета-фактуры" должны быть установлены с каждым "клиентом", как только они будут получены через Интернет. Это может быть сложно, особенно со всеми асинхронными вещами. Вы не знаете, какие звонки будут возвращаться в первую очередь. Это может быть трудно объяснить здесь, но просто прочитайте о материале "контекст данных" в службах RIA или службы данных WCF. Поэтому, когда речь идет о бизнес-приложениях, это для меня главная проблема. Это главным образом основано на урожайности и ремонтопригодность. Вы можете устаревшим образом создавать приложения без контекста данных. Это просто делает вещи проще, особенно в Silverlight, WPF, а теперь и Windows 8 Metro. Наличие реляционных сущностей, загруженных в память асинхронно и имеющих две привязки, действительно приятно иметь.

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

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

в настоящее время я изучаю, какую платформу использовать. Я был бы счастлив использовать либо, но я склоняюсь к OData на основе того факта, что мое следующее приложение в основном касается аналитики (только для чтения), и я хочу богатый выразительный RESTful Api. Я считаю, что данные OData + WCF Службы дают мне это, потому что WebApi поддерживает только $take, $skip, $filter, $orderby над коллекциями. Он не поддерживает проекции, включает ($expand) и т. д. У меня не так много "обновлений/удалений/вставок", и наши данные довольно реляционные.

Я надеюсь, другие присоединятся к дискуссии и высказать свои мысли. Я все еще решаю и хотел бы услышать другие мнения. Я действительно думаю, что оба фреймворка великолепны. Интересно, если вы даже должны выбрать, почему бы не использовать оба, если это необходимо. От клиента это все о создании REST звонки в любом случае. Просто мысль :)

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

Команда OData Блог

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

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

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

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

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

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

Если вы создаете 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

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

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

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

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

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

когда вы используете технологический стек, это имеет огромное значение для использования стека первого класса для Microsoft. У вас даже будет бесчисленное количество опубликованных примеров кода и проектов MS в Github, которые вы можете просто скопировать и начать работу в своем собственном проекте. Это имеет значение на всех уровень, документация, примеры кода, набор функций, поддержка, помощник api s вы называете его.

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

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

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

здесь отличное сравнение.

WEB API

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

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

WCF

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

службы

OData-это просто

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

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