WCF Data Service to usługa sieciowa umożliwiająca łatwy dostęp do danych. Wyobraźmy sobie następujący przypadek:
Mamy pewną bazę danych zawierającą np. informacje o produktach. Można napisać ręcznie usługę WCF, która wyeksponuje wszelkie potrzebne dane za pomocą metod. Usługa w takim przypadku zawierałaby metody typu Create, Update, Delete, GetById, GetByQuery itp. Implementacja usługi dla każdej tabeli w bazie jest dość czasochłonna i niezbyt interesująca. Za pomocą WCF Data Service, usługa zostanie stworzona automatycznie na podstawie modelu encji (np. Entity Framework). Ponadto komunikacja między klientem a WCF może odbywać się za pomocą zapytań LINQ, tak jakbyśmy korzystali z lokalnego Entity Framework.
WCF Data Service oparty jest o architekturę REST (tzw. RESTful Service). Architektura REST składa się z serwera oraz klienta. Klient wysyła żądanie do serwera, które następnie jest przetwarzane. Serwer ma dostęp do zasobów i zwraca tzw. reprezentację zasobów (representation of resource), która przeważnie przyjmuje postać dokumentu XML. Zasoby muszą mieć jakiś jednoznaczny identyfikator (np. URI). Serwer nie przechowuje informacji o stanie – to klient odpowiedzialny jest za przejścia między różnymi stanami.
Architektura REST musi spełniać następujące warunki:
• Bezstanowość ,
• Buforowanie danych,
• SoC (separation of concerns),
• Budowa warstwowa,
• Ujednolicony protokół komunikacji.
Sama idea architektury jest stara (po raz pierwszy została przestawiona w pracy doktorskiej Roya T. Fieldinga, 2000). W praktyce protokołem komunikacji między serwerem a klientem jest najczęściej HTTP. W takim przypadku identyfikatorem zasobów jest zwykły URL (http://www.localhost/users). W zależności od użytej metody HTTP, serwer wykona jedną z następujących operacji:
- HTTP POST – tworzenie zasobu,
- HTTP GET – selekcja danych ,
- HTTP PUT – aktualizacja,
- HTTP DELETE – usunięcie danych.
Przykładowo, poniższe zapytanie spowoduje pobranie listy użytkowników z bazy danych:
GET /users HTTP/1.1 Host: localhost Accept: application/xml
Usługa sieciowa, po otrzymaniu takiego zapytania wywoła metodę odpowiedzialną za selekcję danych z kolekcji encji users. Architektura WCF Data Service wygląda następująco (źródło MSDN):
Klient komunikuje się z usługą za pomocą HTTP. Następnie Data Services Runtime wykorzystując np. Entity Framework pobiera dane z bazy. Możliwe jest napisanie własnych provider’ów, które mogą nawet odwoływać się do baz nierelacyjnych.
Myślę, że teorii na początek wystarczy. Więcej informacji o REST znajdziecie np. na wiki :). Skupmy się teraz jak to wygląda od strony praktycznej. Większość operacji wykona za nas IDE:
- Na początek należy stworzyć oczywiście projekt WCF Service Application.
- Po utworzeniu nowego projektu, dojemy model encji ADO .NET Entity Data Model (Add -> New Item -> Data ->ADO .NET Entity Data Model). Kreator poprowadzi nas i np. wygeneruje model encji na podstawie bazy danych .
- Następnie dodajemy Data Service (Add -> New Item -> Web -> WCF Data Service).
- Zostanie wygenerowany szablon usługi. Należy teraz wstawić w miejsce komentarza prawidłowy model encji. Po zmianach kod powinien wyglądać np. następująco:
public class SalesSystemService : DataService<DataServicesEntities> { }
-
WCF Data Service pozwala zdefiniować prawa dostępu. Można umożliwić klientom np. dostęp tylko do odczytu do produktów:
public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("Products", EntitySetRights.AllRead); }
W zasadzie więcej konfiguracji nie trzeba! Wystarczyło stworzyć model encji, DataService, podmienić typ generyczny oraz skonfigurować prawa dostępu. W tej chwili możemy odpalić usługę i za pomocą przeglądarki przetestować jej działanie.
Aby uzyskać listę wszystkich produktów wystarczy w przeglądarce wpisać http://localhost:5744/Services/SalesSystemService.svc/Products. Jeśli chcemy aby został zwrócony tylko pojedynczy produkt o wskazanym kluczu głównym wystarczy wpisać http://localhost:5744/Services/SalesSystemService.svc/Products(4). Do dyspozycji jest naprawdę wiele sposobów selekcji. Przykładowo http://localhost:5744/Services/SalesSystemService.svc/Products?$filter=BarCode eq ’55’ zwróci produkty tylko o kodzie kreskowym równym 55.
Wszystkie możliwe zapytania są tematem na osobny post. Microsoft dostarcza biblioteki ułatwiające komunikacje z WCF Data Service. Użytkownik (programista) nie musi ręcznie pisać adresów URL. Może skorzystać z API oraz języka LINQ. Jak to wygląda po stronie klienta przedstawię już w następnym poście.