WCF Veri Hizmetleri (OData) ve ASP.NET Web API'si


87

RESTful hizmetleri ve çeşitli istemcilerden (Silverlight, iOS, Windows Phone 7, vb.) Oluşan dağıtılmış bir uygulama tasarlıyorum. Şu anda hizmetlerimi, WCF Veri Hizmetlerini (OData) veya ASP.NET MVC 4 ile birlikte gelen yeni ASP.NET Web API'sini uygulamak için hangi teknolojiyi kullanmam gerektiğini belirliyorum.

Her biri hakkında çevrimiçi olarak birkaç sunum izledim ve şu anda öncelikle URI ve yerel hiper ortam özelliğine yerleşik filtreleme mekanizmaları nedeniyle WCF Veri Hizmetlerine eğiliyorum. Görebildiğim tek dezavantaj, POX'un aksine Atom Pub spesifikasyonunun ayrıntı düzeyidir.

Karar vermeden önce bu iki teknoloji hakkında bilmem gereken bir şey var mı? Neden birisi WCF Veri Hizmetleri yerine ASP.NET Web API'yi seçsin?

Yanıtlar:


31

Bu öznel bir soru, işte öznel bir cevap. IMO, WCF'nin basit RESTful hizmetleri için çok fazla ek yükü vardır. Web API ise özellikle RESTful servisleri için tasarlanmıştır.

Bu konuda Dave Ward ile aynı fikirdeyim . Daha fazla bilgi için bloguna göz atın.

WebForms projelerinde ASMX'ten WCF'ye geçme baskısına uzun zamandır dayandım, çünkü WCF'nin karmaşıklığını kabul etmek öncelikle beni daha az esnek JSON serileştirme ile ödüllendirdi. Aksine, bazı projelerimi ASMX'ten Web API'ye dönüştürmeye başladım ve Web API'nin ASMX'in yerini ne kadar kolay aldığından memnunum.

Microsoft'un nihayet ASMX'in basitliği ile WCF'nin Web API ile gücü arasında iyi bir denge bulduğuna inanıyorum.


2
Cevap için teşekkürler! Bir takip sorum var, umarım ASP.NET Web API'sine aşinasınızdır. WCF Veri Hizmetleri ile ilgili sevdiğim bir şey hiper ortam yetenekleridir. Onların Netflix örneğini kullanarak, bir film türünü sorgulayabilirsiniz ve hizmet, her filmin tüm girişi yerine, bu türdeki her filme bağlantı döndürür. Bunu ASP.NET Web API ile yapmanın bir yolu var mı? Görünüşe göre size hipermedya kullanmak yerine genişletilmiş nesne yapısının tamamını veriyor.
Raymond Saltrelli

Henüz kullanma şansım olmadı, ancak MediaTypeFormatteryanıtlarınızı biçimlendirmek için uygulayabilirsiniz gibi görünüyor . Örnek için code.msdn.microsoft.com/Contact-Manager-Web-API-0e8e373d adresine bakın .
jrummell

2
Bu bir çeşit acı. Bunu açmak için bir tür yapılandırma olacağını umuyordum. Ve eğer otomatik olarak gerçekleşecekse. Patronum Web API için baskı yapıyor çünkü MS'deki tüm yetkiler onu destekliyor. Hepsi olacak ve iyi görünüyor. Yükü OData'dan daha özlüdür, OData'nın URI sorgulama yeteneklerine sahiptir, yalnızca kullanıma hazır hiper ortamı eksiktir. Belki salınma zamanına kadar orada yolunu bulur.
Raymond Saltrelli

1
Microsoft, Web Api üzerinden OData Web API kullanmayı vurguladığı için bu cevabın yeniden gözden geçirilmesi gerektiğini düşünüyorum.
kod

111

Şu anda WebApi ve WCF Veri Hizmetleri arasında kimsenin bahsetmediği başka önemli farklılıklar var. Keşke MS ikisini karşılaştıran iyi bir makale çıkarsa.

Bir süredir OData'yı ve ayrıca WebApi'yi takip ediyorum. Her zaman birkaç büyük fark buldum.

İlk olarak, patronunuzun OData'yı desteklemedikleri anlamına gelmek üzere "MS WebApi'yi destekliyor" derken ne demek istediğinden emin değilim? IMO, her ikisini de destekliyorlar ve şu anda minimum düzeyde örtüşme var. Windows Azure Data Market Verilerini OData kullanarak gösterir, Azure Tablo Depolama OData kullanır, SharePoint 2010 Verileri üzerinden OData Sorgularına izin verir ve Excel PowerPivot gibi MS ürünleri de bunu destekler. İlişkisel Veriler söz konusu olduğunda çok güçlü bir Sorgu çerçevesi. Ve RESTful olduğu için herhangi bir dil, çerçeve, cihaz vb. Onunla entegre olabilir.

OData + WCF Veri Hizmetleri hakkında sevdiğim şeyler:

OData + WCF Veri Hizmetleri nihayet İstemci Uygulamalarının Web üzerinden Verileri sorgularken daha "anlamlı" olmasına izin verdi. Daha önce, bir kullanıcı arayüzü biraz farklı bir şey istediğinde, alçakgönüllü hale gelen ve sürekli değişiklikler gerektiren katı Web API'leri oluşturmak için her zaman ASMX veya WCF kullanmak zorunda kalıyorduk. İstemci Uygulaması, yalnızca hangi kriterlerin döndürüleceğini belirleyen parametreleri belirleyebilir. Ya da yaptığım gibi yapın ve LINQ İfadelerini "Seri Hale Getirin" ve bunları Parametreler olarak aktarın ve Expressions<Func<T,bool>>Sunucuda yeniden nemlendirin . Terbiyeli. İşi tamamladım, ancak LINQ'yi İstemcide kullanmak ve bunu REST kullanarak Web üzerinden çevirmek istiyorum, bu tam olarak OData'nın izin verdiği şeydir ve kendi "hack" çözümümü kullanmak istemiyorum.

Bu, bir DB Bağlantı Dizesine ihtiyaç duymadan "TRANSACT SQL" i açığa çıkarmak gibidir. Basitçe bir URL ve whoala sağlayın! Sorgulamaya başlayın. Elbette, hem WebApi hem de WCF Veri Hizmetleri, Kimlik Doğrulama / Yetkilendirmeyi destekler, böylece erişimi kontrol edebilir, rollere veya diğer veri yapılandırmasına dayalı ek "Nerede" ifadeleri ekleyebilirsiniz. Bunu SQL yerine Web Api Katmanımda yapmayı tercih ederim (Görünümler veya Depolanan İşlemler oluşturma gibi). Ve artık Uygulamalar kendileri sorgular oluşturabildiğine göre, Ad-Hoc ve BI Raporlama araçlarının OData'dan yararlanmaya başladığını ve Kullanıcıların kendi sonuçlarını tanımlamasına izin verdiğini göreceksiniz. Minimum kontrole sahip oldukları Statik Raporlara güvenmemek.

Silverlight, Windows 8 Metro veya ASP.NET'te (MVC, WebForms, vb.) Geliştirme yaparken, Visual Studio'da WCF Veri Hizmetine bir "Hizmet Referansı" ekleyebilir ve Verileri sorgulamak için LINQ kullanmaya hemen başlayabilirsiniz VE bir İstemci üzerindeki "Veri Bağlamı", değişiklikleri izlediği ve değişikliklerinizi otomatik olarak Sunucuya "Göndermenize" izin verdiği anlamına gelir. Bu Silverlight için RIA Hizmetlerine çok benzer. RIA Hizmetleri yerine WCF Veri Hizmetlerini kullanırdım, ancak o zamanlar DataAnnotations veya Actions'ı desteklemiyordu, ancak şimdi destekliyor :) WCF Data Services, "Projeksiyon" gerçekleştirme yeteneği olan RIA Hizmetlerine göre başka bir avantaja sahiptir Müşteriden. Bu, bir Varlıktan tüm Özellikleri döndürmek istemediğim durumlarda performans konusunda yardımcı olabilir. Bir "Veri Bağlamına" sahip olmak

Dolayısıyla, özellikle SQL Server ve Entity Framework kullanıyorsanız, ilişkilerle Verileriniz varsa, WCF Veri Hizmetleri harikadır. Çok az Kod ile REST üzerinden Sorgulanabilir Veri + Eylemleri (işlemleri çağırma çağrıları, yani iş akışları, arka plan işlemleri) hızlı bir şekilde ifşa edebileceksiniz. WCF Veri Hizmetleri yeni güncellendi. Yeni sürüm piyasaya sürüldü. Tüm yeni işlevselliğe göz atın.

WCF Veri Hizmetlerinin dezavantajı, HTTP Yığını üzerinde kaybettiğiniz "kontrol" dür. En büyük kusurun IQueryable<T>Koleksiyonları döndüren Yöntemlerde olduğunu buldum . RIA Services AND WebApi'den farklı olarak, IQueryable Metodunda mantığı geliştirmek için tam erişime sahip değilsiniz. RIA Servislerinde ve WebApi'de, geri döndüğünüz sürece istediğiniz kodu yazabilirsiniz IQueryable<T>. WCF Veri Hizmetlerinde, YALNIZCA Expression<Func<T,bool>>durdurucu Yöntemleri kullanarak "Nerede" İfadesi eklemeye erişiminiz olur . Bu hayal kırıklığı yarattı. Mevcut uygulamamız RIA Hizmetlerini kullanıyor ve gerçekten IQueryable mantığını kontrol etme yeteneğine ihtiyacımız olduğunu görüyorum. Umarım bu konuda yanılıyorum ve sadece bir şeyi kaçırıyorum

Ayrıca, WCF Veri Hizmetleri de henüz tüm LINQ Operatörlerini tam olarak DESTEKLEMEZ. Yine de WebApi'den daha fazlasını destekliyor.

Peki ya WebApi ???

  1. Http İsteği / Yanıtı üzerindeki kontrolü seviyorum
  2. Takip etmesi kolaydır (MVC modellerinden yararlanarak). Eminim daha fazla alet gelecektir.

Şu an itibariyle (anladığım kadarıyla), İstemcide "Veri Bağlamı" desteği yoktur (ör. Silverlight, ASP.NET Sunucu Tarafı Kodu, vb.), Çünkü WebApi aslında WCF Veri Hizmetleri / OData gibi Varlık Veri Modelleriyle ilgili değildir. dır-dir. IQueryable / IEnumerable kullanarak Model Nesneleri Koleksiyonlarını açığa çıkarabilir, ancak Varlıklar İstemciye yüklendikten sonra kullanılacak Birincil Anahtar / Yabancı Anahtar "Gezinme Özellikleri" (yani müşteri.Faturalar) yoktur, çünkü "Veri Bağlamı" yoktur. bu onları eşzamansız olarak (veya $ expand kullanarak bir çağrıda) yükler ve değişiklikleri yönetir. RIA Hizmetlerinde veya WCF Veri Hizmetlerinde yaptığınız gibi, İstemci üzerindeki Varlık Veri Modelinizin kodla oluşturulmuş "temsiline" sahip değilsiniz. İstemcide Verilerinizi temsil eden Modellere sahip olamayacağınızı / sahip olamayacağınızı söylemiyorum, ancak Verileri manuel olarak doldurdunuz ve Web üzerinden erişildiğinde her "müşteri" için hangi "faturaların" ayarlanacağını yönetiyorsunuz. Bu, özellikle tüm Zaman uyumsuz şeyler devam ederken zor olabilir. Önce hangi çağrıların geri geleceğini bilmiyorsunuz. Bunu burada açıklamak zor olabilir, ancak RIA Hizmetlerinde "Veri Bağlamı" konusunu okuyun veyaWCF Veri Hizmetleri . Dolayısıyla, İş Kolu Uygulamaları ile uğraşırken bu benim için büyük bir sorun. Bu, esas olarak üretkenliğe ve sürdürülebilirliğe dayanır. Bir Veri Bağlamı olmadan alışılmadık bir şekilde Uygulamalar oluşturabilirsiniz. Özellikle Silverlight, WPF ve şimdi Windows 8 Metro'da işleri kolaylaştırıyor. İlişkisel Varlıkların belleğe eşzamansız olarak yüklenmesi ve Two-Binding'e sahip olması gerçekten güzel.

Bunu söyledikten sonra, bu WebApi'nin bir gün İstemci üzerinde bir "Veri Bağlamını" destekleyebileceği anlamına mı geliyor? Sanırım olabilir. Ayrıca, daha fazla araçla, bir Visual Studio Projesi, tüm CRUD Yöntemlerinizi bir Veritabanı Şemasına (veya Varlık Çerçevesine) dayalı olarak oluşturabilir.

Ayrıca, WCF Veri Hizmetleri veya WebApi ile çalışma söz konusu olduğunda yalnızca .NET'ten .NET Framework'e bahsettiğimi biliyorum, ancak HTML / JS'nin de önemli bir oyuncu olduğunun farkındayım. Silverlight Kullanıcı Arabirimi veya ASP.NET Sunucu Tarafı Kodu, vb. İle uğraşırken bulduğum avantajlardan bahsediyordum. HTML5 / JavaScript'te "IndexedDB" nin ortaya çıkmasıyla birlikte "Veri Bağlamı" ve JavaScript'teki LINQ çerçevesi de kullanılabilir hale gelebilir, bu da OData Hizmetlerini JavaScript'ten sorgulama becerisini daha da kolaylaştırabilir (DataJS'i bugün OData ile kullanabilirsiniz). Ayrıca, HTML / JS'de MVVM ve Binding'i desteklemek için KnockoutJS'yi kullanmak, onu bir esinti yapacak :)

Şu anda hangi platformu kullanacağımı araştırıyorum. Her ikisini de kullanmaktan mutlu olurdum, ancak bir sonraki Uygulamamın esas olarak Analytics (salt okunur) olması ve zengin, etkileyici bir RESTful API istediğim gerçeğine dayanarak OData'ya yönelme eğilimindeyim. OData + WCF Veri Hizmetlerinin bana bunu sağladığına inanıyorum çünkü WebApi Koleksiyonlar üzerinden yalnızca $ take, $ skip, $ filter, $ orderby'yi destekliyor. Projeksiyonları, İçerirleri ($ genişletir) vb. DESTEKLEMEZ. Çok fazla "Güncelleme / Silme / Ekleme" yok ve Verilerimiz oldukça ilişkisel.

Umarım başkaları da tartışmaya katılır ve düşüncelerini verir. Hâlâ karar veriyorum ve diğer fikirleri duymak isterim. Her ikisinin de çerçevelerin harika olduğunu düşünüyorum. Acaba seçmek zorunda olup olmadığını, gerekirse neden ikisini birden kullanmayasınız? Müşteriden her şey yine de REST çağrıları oluşturmakla ilgilidir. Sadece bir düşünce :)


4
Web Api, eksik barışları ekleyen ve WCF DS'nin kullandığı temele oturtan OData desteği için yeni bir önizlemeye sahip: [link] [ blogs.msdn.com/b/alexj/archive/2012/08/15/…
Johannes Rudolph

@JohannesRudolph - Verdiğiniz bağlantı kulağa ilginç geliyor ama kopmuş.
Olly

Tamam, bunun sadece bir biçimlendirme sorunu olduğunu düşünüyorum. Şu olmalıdır: blogs.msdn.com/b/alexj/archive/2012/08/15/… .
Olly


5
Şu anda 2014'te olduğumuz gibi, Microsoft'un WCF ve WebApi'den OData desteğinin geleceğini tartışmak için bloglar.msdn.com/b/odatateam/archive/2014/03/27/… adlı ilginç bir blog yazısı var .
hardywang

26

Web API'nin OData hizmetleri için doğru platformu sağladığına ve bu nedenle OData sunucu yığınları için öncelikle bu platforma yatırım yapacağına inanıyoruz . Elbette OData çekirdek kitaplıklarına ve istemcisine önemli kaynaklar koymaya devam edeceğiz, ancak OData hizmetleri oluşturmak için bir yığın olarak WCF Veri Hizmetlerine yapılan yatırımı azaltmayı planlıyoruz .

OData Takım Blogu

Öyleyse, şimdi her şey yeterince açık görünüyor


16

Hem Web API hem de WCF Veri Hizmetleri, OData'yı kutudan çıkar çıkmaz destekler. WCF Veri Hizmetleri (WCFDS) ile otomatiktir. Web API ile, IQueryabledenetleyicinizden dönün ve yöntemi ile etiketleyin [Queryable]. Bu $filtersize bahsettiğiniz işlevselliği sağlayacaktır. Ve bu şekilde devam ederseniz, ikisi de accept=application/jsonistek başlığını ekleyerek JSON'u yanıtta otomatik olarak işleyebilir . WCFDS'den OData, Web API'sinden birkaç OData anahtar kelimesini destekler ( $expandakla sadece anahtar kelime gelse de), ancak eminim zaman bunu çözecektir.

Hem .NET istemcileri hem de HTML sayfaları, bu alternatiflerin her ikisini de kolayca çağırabilir, ancak LINQ'dan hoşlanıyorsanız ve .NET istemcileri oluşturuyorsanız, WCFDS, bir hizmet referansı olarak projenize eklenebilir. Bu, tüm HTTP işini tamamen atlamanıza ve koleksiyonları doğrudan sorgulamanıza olanak tanır.

Sonuç olarak, .svc dosyalarını ASP.Net MVC projenize koymanızı engelleyen hiçbir şey yoktur. Ya ya da teklif değil. Sunucunuza veri hizmetleri eklemek sizi çok sayıda denetleyici yazma ihtiyacından kurtarır, ancak isterseniz ek denetleyiciler yazmanıza engel olmaz.


6

Başka bir deyişle :

Bir veri modelini (EDM veya başka türlü) hızlı bir şekilde ortaya çıkarmak istiyorsanız ve çok fazla koda veya iş mantığına ihtiyacınız yoksa, WCF Veri Hizmetleri bunu GERÇEKTEN kolaylaştırır ve iyi bir başlangıç ​​noktası olur.

Bir API oluşturuyorsanız ve yalnızca OData sorgu sözdizimini veya biçimlendirmeyi kullanarak bazı kaynakları (ve mantığı) açığa çıkarmak istiyorsanız, ASP.NET Web API muhtemelen başlamak için en iyi yerdir.

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


5

Devaron, WCF ile Web Api'nin henüz bulamadığım en bilgilendirici incelemesini verdi. Teşekkürler. Şimdi, WCF'nin çok karmaşık olduğu noktaya gelince, karmaşıklığın otomatik olarak negatif olmadığını söyleyeceğim. Gelecekte size sağladığı nefes alma odası için minnettar olacaksınız. Microsoft araçlarında her zaman olduğu gibi zorluk, o geleceği bilmememiz veya kontrol etmememizdir. Umarım Microsoft daha birleşik bir sistemle sonuçlanır ve birkaç yıl boyunca kalır.

Ayrıca inşa etmem gereken büyük bir sistem var ve yolun daha net olmadığı beni vurguluyor. Her şey yoluna girene kadar birkaç ay daha bekletmeyi planlıyorum. Ve şahsen datajları destekliyorum (ayrıca JayData'ya da bakın)


1

Sadece bu şekilde en basit terimlerle ifade edin, temel protokolden geri adım atın ve buna geliştirici / kullanıcı perspektifinden bakın. Web API, Microsoft'un birinci sınıf HTTP tabanlı Rest Framework'dür, WCF değil. Bu, herhangi bir eksik Rest özelliği, spesifikasyonu, WCF'ye değil, Web API borusuna ekleneceği anlamına gelir.

Evet, bunları WCF'de kendiniz uygulayabilirsiniz, ancak cümlede de belirtildiği gibi bunları kendiniz uygulamanız gerekir.

Tıpkı bugün bir Web API'si için 2 faktörlü kimlik doğrulamanın uygulanmasının, temelde bir Açık kaynak projesi olarak başlayan bir Kimlik Doğrulama / Yetkilendirme nuget paketi olan OWIN kullanılarak 15 dakikadan az sürdüğü bir örnek gibi.

Bir teknoloji yığını kullandığınızda, Microsoft için birinci sınıf yığını kullanmak büyük bir fark yaratır. Github'da MS tarafından yayınlanan sayısız örnek kod ve projeye sahip olursunuz, bunları kopyalayıp kendi projenizde bir başlangıç ​​yapabilirsiniz. Adını verdiğiniz her seviyede, dokümantasyonda, kod örneklerinde, özellik setinde, destekte, yardımcı apilerde fark yaratır.

Bu yüzden size basit tavsiyem, Restfull HTTP tabanlı uygulamalar oluşturmak istiyorsanız, web API (veya taşınabilirlik için ASP.NET Core) kullanın ve gerçekten WCF'den uzak durun. Protokol HTTP değilse ve gerçekten HTTP olamazsa, WCF'yi kullanın.


0

Bu soruya TL; DR cevabı budur.

WCF, WEB API'nin veri iletişimi ve aktarımı için tornavidasının İsviçre çakısıdır: WCF, WEB API'nin yapabileceği her şeyi yapabilir, ancak daha fazlasına ihtiyacınız varsa (örneğin, TCP protokolünü kullanarak), WCF gitmenin yoludur.

İşte harika bir karşılaştırma .

WEB API

WEB API'yi kullanmanın bir numaralı nedeni, hafif olmasıdır. Bu, uygulamanın daha basit, öğrenmesi daha kolay, bakımı daha kolay vb. Anlamına gelir. HTTP üzerinden RESTful web hizmetlerine ihtiyaç duyan Web için özel olarak tasarlanmıştır. Bunu yapıyor ve iyi yapıyor. İhtiyacınız olan tek şey buysa, WEB API muhtemelen gitmenin yoludur.

Ayrıca, Açık Kaynaktır (eğer önemsiyorsanız)

WCF

WCF, WEB API'den çok daha fazlasını yapar: çoklu transfer protokollerini, çoklu değişim modellerini destekler (WEB API'sı SignalR veya Web Soketleri ile entegrasyon gerektirir), SOAP hizmetleri WSDL'de tanımlanabilir, ek güvenlik özellikleri ve daha fazlasını içerir. Bu ek işlevselliğe ihtiyacınız varsa WCF ile gidin.

OData

OData basitçe

Sorgulanabilir ve birlikte çalışabilir RESTful API'lerin basit ve standart bir şekilde oluşturulmasına ve kullanılmasına izin veren açık bir protokol. kaynak: http://www.odata.org/

Diğer bir deyişle, yüksek seviye, sadece RESTful HTTP istekleri için belirli bir grameri standartlaştırmaktır. Herhangi bir protokolle aynı faydaları sağlayacak. Ve en az 2013 itibariyle hem WCF hem de WEB API, OData kullanımına izin vermektedir. Bu yüzden muhtemelen OData hakkında endişelenmeye değmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.