BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Wstęp do usług internetowych XML

28-06-2005 22:00 | kazikkuta
Artykuł przeznaczony jest dla osób bardzo początkujących. Opisana jest w nim idea usług internetowych jak i również sposób ich tworzenia i wykorzystania. Na koniec zamieściłem w nim bardzo prostą aplikację, która wykorzystuje architekturę trójwarstwową.

Wstęp.

W artykule opiszę podstawy Usług internetowych XML. Zobaczycie kiedy i jak je stosować.  Pokażę równierz jak utworzyć i skonsumować utworzoną usługę. Na koniec wymienię siedem rzeczy, na które trzeba zwrócić uwagę tworząc usługę i używając jej.

Co to jest Usługa Internetowa XML?

Usługa internetowa jest podobna pod wieloma względami do aplikacji internetowej. Jest uruchomiona na serwerze, ma za zadanie odpowiadać na zapytania http. Różnica pojawia się gdy spojrzymy na to co jest zwracane przez usługę. Usługa ma dostarczać czystych danych w formie XML co wyrażnie kontrastuje z aplikacją sieciową która dostarcza danych razem z ich prezentacją w postaci kodu html.

Na rysunku widać typową sytuację. Usługa jest zaimplementowana na serwerze. Klient wywołuje typową metodę z języka C#. Jest ona z kolei tłumaczona na zapytanie http wędrujące do serwera z uruchomioną usługą. Gdy dotrze ono do usługi zostaną z niego wydobyte informacje i wywołana będzie odpowiednia metoda, której wynik zostanie zwrócony do klienta pod postacią XML. Jeśli przyjrzymy się głębiej zauważymy, że wymiana komunikatów między klientem a usługą jest realizowana przez protokół SOAP. Wszystko (prawie) jest realizowane poprzez ASP.NET automatycznie, gdyż dostarcza ono infrastruktury do przetwarzania XML oraz do tworzenia i odczytywania komunikatów SOAP.

Kiedy stosujemy Usługi internetowe?

Nie da się poprawnie zastosować usługi internetowej nie mając pojęcia na temat architektury. Po pierwsze dla tego, że opłaca się je stosować tylko wtedy, gdy tworzymy duży system rozproszony, a w tedy pojęcie architektura pojawia się na samym początku. Nie opłaca się tworzyć usług internetowych gdy cały system będzie działał na jednej maszynie. Ale jeżeli bierzemy pod uwagę to, ze jedna maszyna może z czasem nie dać rady obsłużyć zadań,  które będą się pojawiać, to rozważenia użycia usług internetowych XML nie będzie już takim złym pomysłem.

 

Usługi internetowe same w sobie nie powinny zawierać kodu, który manipuluje danymi lub je zwraca. Tym zadaniem powinna się zająć warstwa biznesowa, być może także poprzez warstwę dostępu do danych. Sama usługa służy tylko do wystawienia na świat zewnętrzny możliwości systemu.Może przy tej okazji łączyć funkcjonalności kilku bibliotek.

 

Usługę sieciową można także wykorzystać do przydzielenia grupom użytkowników odpowiednich dla nich funkcji. Możemy sobie wyobrazić dwie grupy (użytkownicy i administratorzy), które potrzebują odmiennych funkcji systemu. Tworzymy wtedy dwie usługi z odpowiednimi metodami. Ponadto usługa może sprawdzić, czy ten kto chce z niej skorzystać ma ku temu odpowiednie uprawnienia. Służy do tego między innymi opcjonalny nagłówek protokołu SOAP.

 

Jak to zrobić?

Aby stworzyć usługę sieciową trzeba wykonać trzy czynności:

  1. Trzeba zapewnić funkcjonalność naszej usługi.
  2. Trzeba dostarczyć jej infrastruktury by mogła być wywołana z zewnątrz.
  3. Trzeba dostarczyć opisu w jaki sposób można używać usługi.

Funkcjonalność zapewniamy tworząc  typowy kod .NET napisany w  jakimkolwiek języku. Trzeba pamiętać o tym, że klasa którą tworzymy musi dziedziczyć po System.Web.Services.WebService. Dobrze jest też opatrzyć ją atrybutem [WebService] i ustawić w nim parametr Namespace (domyślnie jest nim „http://tempuri.org”). Zmiana tej wartości na jakąś unikalną nazwę pozwoli rozróżnić naszą usługę od wielu innych z sieci. Powinno się ją zmienić jeśli nasza usługa jest stworzona do publicznego użytku. Najczęściej jest to adres URL z naszą domeną. Description  jest kolejnym parametrem zawierającym krótki opis usługi. Aby poinformować ASP o tym ze metody które tworzymy wewnątrz klasy mają być wyeksponowane na zewnątrz usługi trzeba je opatrzyć atrybutem [WebMethod].

Drugą rzeczą, którą trzeba zrobić jest pokazanie klientowi gdzie leży nasza metoda. Visual Studio robi to za nas automatycznie tworząc plik .asmx, zawsze kiedy tworzymy projekt z usługą. Zapytanie pochodzące od klienta zostanie skierowane przez ASP do tego właśnie pliku. Z tego pliku będzie on przekierowany do biblioteki stworzonej podczas kompilacji.

Trzecią rzecz którą Visual Studio załatwia za nas jest stworzenie opisu.  Wystarczy tylko opatrzyć metody odpowiednimi atrybutami. Jeśli to zrobimy, to Visual Studio wygeneruje nam Service Help Page, stronę która będzie przedstawiać nasze metody. Można ją zobaczyć używając przeglądarki i wywołując plik .asmx. Zobaczymy wtedy spis metod, które można wywołać w naszej usłudze.

Możemy też sprawdzić nasze metody po prostu klikając na nich i wprowadzając dane testowe.

Jest to nieformalny opis usługi. Formalnym sposobem opisania jest użycie WSDL (Web Service Description Language). Plik napisany w tym języku zawiera definicję typów używanych przez usługę (zarówno tych których używamy jako parametrów, jak i tych które ma zwracać nasza usługa). Definiuje on też komunikaty które są dla usługi zrozumiałe oraz wyznacza protokoły używane w tej komunikacji. To dzięki niemu (prawie) wszystkie systemy wiedzą w jaki sposób można się dogadać z naszą uslugą.

Troszeczkę o atrybucie [WebMethod].      

Atrybut [WebMethod] posiada serię pól które powinno się zmienić lub pozostawić wartości domyślne, w zależności od zastosowania. Opisuje tutaj wszystkie:

Pole  BufferResponse pozwala buforować odpowiedzi naszego serwisu. Domyślnie jest ustawione na  true, co pozwala  na buforowanie całej odpowiedzi zanim zostanie ona wysłana do klienta. Jeśli zmienimy tą własność na false, ASP.NET będzie buforować odpowiedź w 16KB porcjach.

Kolejną własnością jest CacheDuration która pozwala przetrzymywać odpowiedzi naszego serwisu.ASP.NET będzie pamiętać odpowiedź dla każdego unikalnego zestawu parametrów przez tyle sekund ile jest podanych jako wartość atrybutu (przy czym 0 jest tutaj wartością domyślną, która wyłącza caching). Pozwala na odciążenie servera

Następnym polem  który warto zmienić jest Description. Zawiera ono opis metody który pojawia się na Service help page. Domyślnie jest to pusty string.

Z kolei EnableSession pozwala włączyć stan sesji dla usługi. Jesli jest włączony usluga może czytać z HttpContext.Current.Session. Domyślnie jest tam wartość false.

MessageName z kolei pozwala na nadanie unikalnych identyfikatorów dla przeładowanych metod, używając aliasów. Domyślnie aliasem jest nazwa metody. Jeśli MessageName jest zmienione, w ASP tworząc komunikat SOAP zastąpi aliasem oryginalną nazwę metody.

Ostatnią, ale chyba najbardziej interesującą własnością jest TransactionOption która pozwala metodzie działać jako korzeń transakcji. Trzeba pamiętać, że TransactionOption obsługuje tylko dwa zachowania. Można ustawić tą własność Disabled i wtedy nie bierze ona udziału w transakcji (jest to wartość domyślna). Można tez wymusić stworzenie nowej transakcji (Required, RequiresNew). Kolejną rzeczą o której trzeba pamiętać jest dodanie referencji do System.EnterpriseServices.dll. Ta biblioteka zawiera metody które pozwalają na kontrolowanie transakcji. Używamy wtedy także klasy EnterpriseServices.ContextUtil by wywołać metodę SetAbort albo SetComplete poprzez dodanie odpowiedniego atrybutu.

Jak to zjeść.

Na początek trzeba pokazać naszej aplikacji gdzie leży usługa internetowa XML, którą chcemy skonsumować. Robimy to ustawiając referencje sieciową (Web Refference). Jest na to kilka sposobów. Można ustawić referencje wskazując URL usługi albo WSDL usługi. Można też dodawać referencje do komputera lokalnego (tak będzie najczęściej w naszym przypadku), lub poprzez UDDI (Universal Description Discovery and Integration) znaleźć i skorzystać z gotowych usług wystawionych przez różne organizacje. Na koniec podajemy WebReferenceName, czyli przestrzeń nazw w jakiej będzie dostępna usługa w naszej aplikacji.

Kiedy dodajemy referencje internetową Visual Studio generuje nam kod lokalnej klasy proxy której będziemy używać do wywoływania usługi. Klasa ta dostarcza metod do wywoływania metod usługi w dwojaki sposób. Można je wywołać przez metodę której nazwa jest identyczna z nazwą metody w usłudze. W ten sposób wywołamy metodę w sposób synchroniczny. Można też wywołać ją w sposób asynchroniczny. Proxy dostarcza do tego celu po dwie metody z  przedrostkami Begin oraz End. Obiekt Proxy dostarcza nam również klasy które są używane podczas komunikacji z usługą.

Proxy zawiera także kilka interesujących pól, takich jak URL naszej usługi (zmieniając je można zmieniać usługi podczas działania aplikacji). Następną jest Credencials która zawiera nazwę użytkownika oraz hasło potrzebne do autentykacji przez IIS. Jest także własność Proxy (nie mylić z klasą Proxy), która wskazuje na odpowiedni serwer Proxy.

Demo… czyli najprostsza aplikacja trójwarstwowa w mniej niż 10 minut.

Teraz nadszedł czas na coś praktycznego. Będzie to prosta (nawet bardzo prosta) aplikacja trójwarstwowa, zawierająca w sobie bibliotekę klas, usługę sieciową udostępniającą metodę z biblioteki oraz prostą aplikację korzystającą z usługi. Usługa będzie zwracać string z aktualnym czasem serwera. Więc do roboty. Otwieramy Visual Studio i zaczynamy od stworzenia biblioteki (File > New > Project i wybieramy Class Liblary). Nadajemy jej jakąś sensowną nazwę (np.  DemoTimeClassLiblary). Wypełniamy ją następującym kodem

[Kod C#]

public static string GetCurrentTime()

            {

                  return DateTime.Now.ToLongTimeString();

            }

i budujemy bibliotekę.

Teraz idziemy do Solution Explorer, klikamy prawym klawiszem myszki i dodajemy nowy projekt. Będzie nim ASP.NET Web Service. Zmieniamy nazwę na troszkę więcej mówiącą (np. DemoTimeWebService) i nie zapominamy o ustawieniu naszej usługi jako projektu startowego. Teraz musimy dodać referencje do biblioteki z naszą metodą. Powinna być na zakładce Projects. Wybieramy naszą bibliotekę. Gdybyśmy chcieli skorzystać z już gotowej biblioteki to mamy do wyboru biblioteki COM oraz .NET lub możemy ją wskazać bezpośrednio.

Potem dodajemy do kodu następującą metodę, opatrzoną atrybutem [WebMethod].

[Kod C#]

[WebMethod]

            public string GetTime()

            {

                  return DemoTimeClassLibrary.Class1.GetCurrentTime();

            }

Klikamy Run żeby sprawdzić czy wszystko działa. Powinna się pokazać Help Page naszej usługi. Jak widać Visual Studio ostrzega nas o tym, że używamy domyślnej przestrzeni nazw dla naszej usługi. Podaje też, w jaki sposób zmienić tą przestrzeń w językach C# oraz VB. Gdybyśmy zmienili atrybuty [WebMethod] lub [WebService] opatrując go odpowiednimi polami (np. Description) strona zawierałaby także i  te informacje.

 

Teraz zbudujemy prostą aplikację która skorzysta z naszej wystawionej usługi. W tym celu budujemy nowy projekt. Niech będzie to Windows Application. Dodajemy do formy etykietę, którą wypełnimy stringiem zbudowanym z pomocą naszej usługi. Musimy też dodać referencję do naszej usługi (Web Reference). Aby to zrobić klikamy prawym klawiszem na References w Solution Explorer i wybieramy Add Web Reference. Pokaże nam się okno w którym możemy wybrać z jakiego źródła chcemy wydobyć naszą usługę. W naszym wypadku jest to lokalny komputer. 

Po wybraniu Web Services on the local machine ukaże nam się spis wszystkich usług uruchomionych na naszym komputerze. Wybieramy tą o którą nam chodzi (jesli nie zmieniliśmy nazwy usługi i wszystkie to Service1, to można je rozróżnić po URL) i idziemy dalej.

 

Ukaże nam się znajoma strona Help Page. Wystarczy już tylko zmienić Web reference name, kliknąc OK i mamy utworzoną klasę proxy, którą możemy wykorzystać do wywołania naszej usługi.

Teraz klikamy dwa razy na formie i wypełniamy powstałe wydarzenie Form_Load następującym kodem.

[Kod C#]

private void Form1_Load(object sender, System.EventArgs e)

{

   TimeWebService.Service1 proxy = new TimeWebService.Service1();

   proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

   string time = proxy.GetTime();

   label1.Text = String.Format("You turn me on at {0}", time);

}

 

 Pierwsza linijka tworzy nam obiekt proxy usługi. W drugiej ustawiamy hasło i użytkownika na ustawienia domyślne naszej maszyny. W trzeciej wywołujemy metodę naszej usługi, której efekt wyświetlamy na etykiecie (czwarta linijka). Klikamy Run i mamy naszą aplikację. Jak widać nie jest to zaawansowana aplikacja, ale myślę, że pokazuje ona metodę i ideę tworzenia aplikacji wielowarstwowych.

Na co trzeba uważać.

Zanim skończę chcę przypomnieć kilka podstawowych spraw, które trzeba brać pod uwagę tworząc usługę internetową.

  1. Usługa internetowa jest używana jako część większego systemu rozproszonego. Klientem usługi będzie aplikacja a nie użytkownik, więc projektując i implementując ją trzeba brać to pod uwagę.
  2. Usługa sama w sobie nie zawiera stanu. Innymi słowy nie pamięta nic na temat użytkownika zaraz po tym jak przestanie on jej używać. Całe szczęście jest jeszcze ASP.NET wraz ze swoimi stanami sesji i w razie konieczności można go użyć.
  3. Wywołanie usługi jest kosztowne (trzeba wymienić komunikaty przez sieć). Lepiej więc jest wykonać jedno wywołanie metody, które zwróci wszystkie potrzebne dane niż wywoływać kilka razy i dostawać dane częściowe.
  4. Eksponowanie usługi może być niebezpieczne. Wymieniamy przecież niezaszyfrowane dane przez sieć, w dodatku używając XML, który jest łatwo odczytywalny dla postronnych osób.
  5. Usługa może być używana przez tysiące konkurujących użytkowników. Trzeba myśleć o skalowalności aplikacji by mogła obsłużyć w razie potrzeby zwiększoną liczbę użytkowników przy stosunkowo małych nakładach pracy i pieniędzy.

Podsumowanie.

Mam nadzieję, że udało mi się przybliżyć wam ideę usług internetowych. Myślę, że znajdziecie kilka miejsc w waszych aplikacjach gdzie można je z powodzeniem zastosować. Oczywiście artykuł ten ze względu na przeznaczenie dla początkujacych użytkowników platformy nie wyczerpuje całej wiedzy dotyczącej usług. Zainteresowanych tym tematem odsyłam do innych artykułów na codeguru.pl, oraz na stronę www.franklins.net gdzie znajdziecie miedzy innymi filmik w jaki sposób wywołać usługę asynchronicznie w niecałe 5 minut.

 

Komentarze 4

User 79341
User 79341
39 pkt.
Poczatkujacy
21-01-2010
oceń pozytywnie 0

"Mam nadzieję, że udało mi się przybliżyć wam ideę usług internetowych"

hmmm... wedlug mnie - nie za bardzo. Uslugi internetowe to rowniez smtp, www, telnet, ssh... wiec raczej "WebService" nie powinno byc tlumaczone na jezyk polski ;)

Piotr Gaszewski
Piotr Gaszewski
15 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0

Na plus - niezły artykuł dla naprawdę początkujących,

Na minus - "równierz" - błędy ortograficzne w epoce automatycznego sprawdzania pisowni - niewybaczalne :P

Ocena: 5

User 79106
User 79106
290 pkt.
Junior
21-01-2010
oceń pozytywnie 0

Ja bym się tam nie czepiał...

Poziom trudności: Początkujący
Kategorie: Usługi internetowe XML (XML WebServices)

To mówi samo za siebie. IMHO dla kogoś, kto nie słyszał do tej pory o XML Web Services taki artykuł trochę wytłumaczy i rozjaśni.

kazikkuta VIP
kazikkuta
840 pkt.
Senior
21-01-2010
oceń pozytywnie 0
Masz całkowitą rację. Przepraszam tym bardziej, że błąd się rzuca w oczy i razi już w we wstępie...
pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.