Службы данных 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 ответов:
это субъективный вопрос, поэтому вот субъективный ответ. ИМО, 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???
- мне нравится контроль над Http-запросом / ответом
- легко следовать (используя шаблоны 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 сервисы.
Итак, кажется теперь все достаточно ясно
как веб-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 вероятно, это лучшее место для начала.
Деварон дал самый информативный комментарий ФОС против веб-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. Так что, вероятно, не стоит беспокоиться об Одате.