20. Korzystanie z Web Service'ów

20. Korzystanie z Web Service'ów

Autor: Piotr Gaszewski

Opublikowano: 6/23/2006, 12:00 AM

Liczba odsłon: 90944

Web Service’y, określane również jako usługi sieciowe, umożliwiają budowę prostych, rozproszonych aplikacji, niezależnych od platformy. W swoim działaniu wykorzystują one powszechnie znany standard XML. Dostęp do usług sieciowych jest również niezwykle prosty, dzięki zastosowaniu standartowych protokołów, takich jak HTTP czy SOAP. Web Service’y mogą być wykorzystywane do integracji aplikacji tworzonych w rozmaitych językach programowania, na różnych platformach deweloperskich. Jedną z ich najważniejszych zalet jest fakt, że aplikacja kliencka, która chce skorzystać z udostępnianej usługi, nie musi być stworzona w tym samym języku, co Web Service, co więcej – nie musi nawet posiadać wiedzy na temat budowy usługi. Jedyne, co jest potrzebne, do wykorzystywania tej technologii, jest internetowy adres usługi, oraz nazwy metod przez nią udostępnianych. W rozdziale tym pokażę, w jaki sposób możemy wykorzystywać Web service’y przy tworzeniu stron internetowych w technologii ASP.NET.

Na początku spróbujmy utworzyć prosty Web Service za pomocą Visual Studio 2005. Po otwarciu środowiska programistycznego wybieramy kolejno opcje: File -> New -> WebSite -> ASP.NET Web Service. W ostatnim przypadku musimy ponadto podać położenie plików projektu na dysku twardym komputera (może być to również maszyna zdalna – pliki udostępniane są wówczas za pośrednictwem protokołów HTTP lub FTP), oraz język programowania, w którym zostanie stworzona usługa. Standartowo, do wyboru mamy języki: Visual Basic, C# oraz J#.

Po naciśnięciu przycisku „OK.” Visual Studio utworzy projekt, korzystając z gotowego szablonu. W oknie Solution Explorera możemy obejrzeć pliki wchodzące w skład naszej usługi sieciowej.

W tym momencie najbardziej będzie interesować nas zawartość pliku Service.cs. Przyjrzyjmy się jego zawartości.

using System;

using System.Web;

using System.Web.Services;

using System.Web.Services.Protocols;

 

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class Service : System.Web.Services.WebService

{

    public Service () {

 

    }

 

    [WebMethod]

    public string HelloWorld() {

        return "Hello World";

    }

   

}

Widzimy, że nasz Web Service to w rzeczywistości pojedyncza klasa dziedzicząca po klasie System.Web.Services.WebService. Klasa posiada domyślny konstruktor, oraz jedną, gotową do wykorzystania, metodę o nazwie HelloWorld (a jakżeby inaczej J). Zauważmy, że metody, które mają być udostępniane przez usługę sieciową muszą posiadać atrybut o nazwie [WebMethod].

Stworzony przez Visual Studio Web Service jest w tym momencie gotowy do działania. Uruchamiamy go naciskając przycisk F5 (lub kombinacje klawiszy: Ctrl + F5). Jeżeli wszystko przebiegło pomyślnie w oknie przeglądarki powinniśmy ujrzeć następujący widok.

W górnej części ekrany możemy dostrzec listę metod, udostępnianych przez usługę sieciową. Na razie, w tym miejscu widnieje tylko jedna metoda, o nazwie HelloWorld. Aby zaprezentować działanie Web Service’u klikamy lewym przyciskiem myszy na nazwie metody. Zostaniemy wówczas przeniesieni na stronę, z której możemy wywołać powyższą metodę.

Aby uruchomić działanie metody naciskamy po prostu przycisk „Invoke”. W tym momencie powinno otworzyć się nowe okno przeglądarki, zawierające odpowiedź w formacie XML.

  <?xml version="1.0" encoding="utf-8" ?>

  <string xmlns="http://tempuri.org/">Hello World</string>

Widzimy, że jedyną czynnością, która jest wykonywana przez naszą metodę jest zwrócenie ciągu odpowiedniego napisu. Często musimy jednak przekazać do metody usługi pewne informacje. Mogą być to przykładowo numer NIP, którego poprawność musi zostać sprawdzona, lub inne wartości, na których mają być wykonywane obliczenia. Spróbujmy teraz dodać do klasy Service metodę o nazwie Add. Jej zadaniem będzie zwracanie sumy dwóch parametrów przekazanych do metody. Przedstawiony poniżej kod metody nie różni się niczym od tego, wykorzystywanego w „zwykłych” klasach języka C#. Jedyną różnicą jest podanie przed nazwą metody atrybutu [WebMethod]. Informuje on, że metoda ta może zostać wywołana przez aplikacje, korzystające z Web Service’u.

            [WebMethod]

            public int Add(int a, int b)

            {

                        int c = a + b;

                        return c;

            }

Przy próbie wywołania metody przez naciśnięcie przycisku „Invoke” zostaniemy teraz poproszeni o podanie parametrów wejściowych metody.

W ostatniej części artykułu postaram się zaprezentować, w jaki sposób wykorzystać nasz Web Service w aplikacji ASP.NET. Pierwszym krokiem, który musimy w tym celu wykonać jest dodanie referencji do naszej usługi sieciowej. Wybieramy w tym celu z menu kolejno opcje: Website -> Add Web Reference. W nowo otwartym oknie podajemy adres naszego Web Service’u. W moim przypadku będzie to:

http://localhost:1032/WebService01/Service.asmx?wsdl.

Pamiętajmy, aby po nazwie pliku nie zapomnieć o zakończeniu adresu ciągiem „?wsdl”. WSDL (Web Service Description Language) jest formalnym językiem opisu usługi. Zapewnia obsługę typów, informuje o używanych protokołach. Właśnie dzięki niemu różnorodne systemy mogą wykorzystywać pojedynczy Web Service. 

Następnie naciskamy przycisk „Go”. Jeżeli Web Service zostanie odnaleziony w powyższym oknie pojawią się nazwy metod, udostępnianych przez niego. Wówczas pozostaje nam jedynie naciśnięcie przycisku „Add Reference”.

Teraz pozostaje nam jedynie użycie metod, udostępnianych przez naszą usługę sieciową. Robimy to w bardzo podobny sposób, jak w przypadku wykorzystywania lokalnych bibliotek. Na początku musimy utworzyć obiekt reprezentujący Web Service. Następnie wywołujemy jego metodę. Kod źródłowy prezentujący wywołanie metody HelloWorld naszego Web Service’u prezentuje się następująco:

    protected void Page_Load(object sender, EventArgs e)

    {

                        localhost.Service myservice = new localhost.Service();

                        this.Response.Write(myservice.HelloWorld());

    }

W analogiczny sposób możemy wywołać metody, do których przekazujemy parametry.

    protected void Page_Load(object sender, EventArgs e)

    {

                        localhost.Service myservice = new localhost.Service();

                        this.Response.Write((myservice.Add(12,13)).ToString());

    }

Na koniec podam kilka istotnych faktów, o których musimy pamiętać projektując usługę sieciową. Po pierwsze, wymienianie danych w ten sposób jest dość kosztowne, ponieważ wykorzystuje komunikację sieciową. Lepiej więc korzystać z usługi rzadziej, za to za jednym razem żądając większej ilości danych wynikowych. Inna sprawą, o której musimy pamiętać, jest fakt, że dane są przesyłane przez sieć w sposób niezaszyfrowany, wykorzystując format XML, co ułatwia ich odczytanie przez nieuprawnione osoby. W końcu, projektując tego typu usługę musimy wziąć pod uwagę fakt, że może być ona jednocześnie używana przez setki, a nawet tysiące osób. Trzeba więc myśleć o skalowalności aplikacji, aby była ona w stanie obsłużyć określoną ilość użytkowników.