Web Services – usługa sieciowa w .NET Framework

Tworzenie usług sieciowych Web Services w .NET Framework przy użyciu Visual Studio nie jest ciężkim zadaniem, jeżeli poznamy podstawowe zasady, które temu towarzyszą. Pamiętać należy przy tworzeniu własnej Web Service o przejrzystym prezentowaniu metod publicznych oraz ich praktyczności.

W .NET Framework 4.0 Web Services wchodzą w skład komponentów projektu ASP.net. Aby utworzyć naszą usługą Web Service klikamy kolejno File -> New -> Web Site -> ASP.net Web Site, nadajemy nazwę projektowi i klikamy OK. Początkowa procedura jest identyczna jak podczas tworzenia zwykłej witryny ASP.net (więcej w tej kwestii znajduje się we wpisie Środowisko Visual Studio 2010 (ASP.net) – wprowadzenie). Następnie w oknie Solution Explorer dodajemy nowy komponent (Add New Item…) i wybieramy Web Service, której nadajemy nazwę CodeEnclaveWebService. Gdybyśmy postanowili utworzyć nasza usługę przy pomocy zwykłego Projektu, jego struktura wewnętrzna wyglądałaby nieco inaczej. Plik Default.aspx/cs może posłużyć nam do wstępnego testowania metod naszej Web service, jednak ona sama posiada podstawowe narzędzie stworzone w tym celu.

Nowa usługa Web Services

Nowa usługa Web Services

Standardowo nasza usługa posiada jedną demonstracyjną metodę Hello World. Po uruchomieniu pliku CodeEnclaveWebService.asmx poprzez klawisz F5 możemy ją wywołać w ramach testów, następnie klikamy na Invoke i widzimy, co zwraca dana metoda. Dane zwrócone przez metodę są w postaci dokumentu XML, jednak sama metoda nie musiała o to zadbać z poziomu kodu C#. My jednak możemy sami decydować co i w jaki sposób chcemy zwracać przy pomocy naszych metod, oczywiście wszystko odbywać się będzie przy użyciu dokumentów XML.

Tworzenie bazy danych dla Web Services

Baza danych jest jednym z podstawowych komponentów wielu usług sieciowych. Możemy utworzyć naszą bazę danych manualnie, jednak nie omówiłem jeszcze dokładniej kwestii pliku konfiguracyjnego Web.config. Skorzystamy więc z metody automatycznej, która przygotuje naszą bazę danych do obsługi użytkowników, z których również na razie nie będziemy korzystali dla zachowania przejrzystości i prostoty projektu.

W oknie Solution Explorer klikamy na ASP.NET Configuration. Nasza baza danych zostanie wygenerowana automatycznie wraz z powiązaniem w pliku Web.config. Pamiętać należy przy tym, aby w systemie Windows była uruchomiona usługa SQL Server (SQLEXPRESS).

Nasza prosta usługa Web Service będzie miała za zadanie udostępniać dane produktu oraz składować je. W tym celu tworzymy nową tabelę project_Products w bazie danych.

Tabela produktów usługi Web Service

Tabela produktów usługi Web Service

Istotnym jest, aby pole ProductId posiadało właściwość Identity Specyfication ustawioną na Yes.

Tabela produkty - Identity Specyfication

Tabela produkty – Identity Specyfication

Dla obiektowej obsługi bazy danych z poziomu kodu C# utworzyć należy odwołanie LINQ do tabeli naszej bazy danych. Nadajemy mu nazwę LinqDb.dbml i umieszczamy w nim odwołanie do tabeli project_Products. Sposób tworzenia obiektów klas LINQ odnoszących się do poszczególnych tabeli bazy danych opisany został w poście LINQ to SQL w ASP.net – wprowadzenie.

Metody w Web Services

Nasza usługa będzie posiadała dwie główne udostępniane metody, jedna będzie odpowiedzialna za dodawanie nowego rekordu do bazy danych, druga za zwracanie żądanych rekordów.

W Web Services kod metod możemy umieścić bezpośrednio w pliku usługi CodeEnclaveWebService.cs, jednak wprowadzałoby to spory bałagan, dlatego lepiej jest to zrobić w sposób warstwowy. Możemy dodać warstwę interfejsu, która będzie modyfikowała dane wyjściowe w zależności od wymaganego formatowania danych, jednak ją akurat pominiemy z uwagi na niewielką ilość metod. Bardziej istotna jest warstwa dostępu do danych DAL (Data Access Layer). To ona wywołana z poziomu metod udostępnianych przez Web Service będzie komunikowała się z bazą danych oraz wykonywała operacje na danych.

W oknie Solution Explorer wybieramy Add New Item…, następnie Class i nadajemy nowej klasie nazwę DAL.cs. Następnie według kodu poniżej dodajemy do klasy przestrzeń nazw CodeEnclaveWebServices.Data, za pomocą której będziemy odwoływali się do metod zawartych w klasie.

Do kodu w CodeEnclaveWebService.cs dodajemy również przestrzeń nazw CodeEnclaveWebServices.

Modyfikujemy plik CodeEnclaveWebService.asmx dodając we właściwość Class wartość CodeEnclaveWebServices.CodeEnclaveWebService.

Metoda Web Services realizująca dodawanie nowych danych do bazy danych

Najprostszym z możliwych sposób przekazania danych przez aplikację zewnętrzną do bazy danych Web Services jest przekazanie ich przy pomocy osobnych argumentów metody usługi sieciowej. Samą metodę tworzymy w klasie DAL.

Metoda SetProduct wykorzystuje rozszerzenie LINQ to SQL w celu dodania nowych danych.

Powyższą metodę wywołujemy następnie z poziomu kodu naszej usługi sieciowej Web Services.

Tego typu realizacja jest zrozumiała i prosta, jednak często nie daje uniwersalności. Skoro nasza usługa sieciowa będzie zwracała dane w postaci dokumentów XML, w taki sam sposób może je również przyjmować, co da nam pełną uniwersalność w obsłudze danych na różnych platformach.

Podczas budowania metod obsługujących dane XML musimy zwracać uwagę na pewne szczegóły. Zademonstruję dwie metody, które dla zewnętrznego programisty korzystającego z Web Services pozornie będą wyglądały identycznie, jednak pierwsza z metod będzie wymagała od niego ścisłego przestrzegania struktury pliku XML, druga natomiast jedynie jego szkieletowej budowy.

Realizacja dodania danych do bazy danych odbywa się cały czas przy użyciu LINQ to SQL. Musimy natomiast dokonać odczytu poszczególnych danych do zapisu z przekazanego dokumenty XML. Wiemy, że nasz dokument XML posiada gałąź główną dataBase, gałąź podrzędną dataRow, która przechowuje cały rekord danych oraz kolejne pola danych naszego rekordu danych. Stąd trzy razy musimy przemieścić się po pierwszych gałęziach podrzędnych naszego drzewa [9]. Wiedząc jakie dane i w jakiej kolejności znajdują się w dokumencie XML możemy dokonać ich odczytu [10], a następnie przemieszczać się do kolejnego pola danych [11].

Rozwiązanie wydaje się więc proste, wymaga jednak od programisty korzystającego z naszej usługi Web Services znajomości wymaganej kolejności danych w przekazywanym dokumencie XML, więc w wielu przypadkach nie będzie to rozwiązanie optymalne.

Odczyt poszczególnych pól danych dokumentu XML można zrealizować w bardziej uniwersalny sposób.

Powyższa metoda wyszukuje elementy według ich nazwy w dokumencie XML [8]. Wyszukiwany jest tylko pierwszy element o wskazanej nazwie – za pośrednictwem wskazania Item(0), gdyż przekazujemy tylko jeden rekord danych i elementy nie powtórzą się. Nie musimy tutaj dbać w tym przypadku o pominięcie nadrzędnych gałęzi, a programista korzystający z udostępnianych Web Services nie musi wiedzieć nic o wymaganej kolejności poszczególnych pól danych w przekazywanym dokumencie XML.

Metoda Web Services zwracająca dane z bazy danych

Demonstrowana metoda dokona zwrócenia w postaci dokumentu XML wszystkich danych z tabeli bazy danych przy użyciu rozszerzeń LINQ to SQL oraz LINQ to XML, które zostały już opisane wcześniej, dlatego nie będę powtarzał tutaj treści.

Metoda korzysta z opisanej również wcześniej metody konwertującej obiekt klasy XDocument na obiekt klasy XmlDocument.

Pamiętać musimy, że przy pomocy standardowych narzędzi Web Services nie możemy przetestować metody wymagających jako argumentów np. dokumentów XML.

CodeEnclave Web Service

CodeEnclave Web Service

W kolejnych wpisach zademonstruję sposoby korzystania ze zbudowanej usługi Web Services przy wykorzystaniu różnych technologii.

Plik z projektem użytym we wpisie: Web Services – usługa

Enhanced by Zemanta
Loading Disqus Comments ...
Loading Facebook Comments ...