Webszolgáltatások Webszolgáltatások felhasználása Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendı anyag vázlatát képezik. Ismeretük szükséges, de nem elégséges feltétele a sikeres zárthelyinek, illetve vizsgának. Sikeres zárthelyihez, illetve vizsgához a jelen bemutató tartalmán felül a kötelezı irodalomként megjelölt anyag, a gyakorlatokon szóban, illetve a táblán átadott tudnivalók ismerete, valamint a gyakorlatokon megoldott példák és az otthoni feldolgozás céljából kiadott feladatok önálló megoldásának képessége is szükséges. katona.krisztina@nik.bmf.hu 2 Tartalom A webszolgáltatás fogalma Szolgáltatásközpontú rendszerek Szabványok és protokollok Webszolgáltatás felhasználása XML áttekintés katona.krisztina@nik.bmf.hu 3 1
Mi a webszolgáltatás? Szoftverkomponens, amely hálózaton keresztül szolgáltatásokat nyújt Általában nagyobb rendszerek adott feladatot ellátó része A felhasználó (legtöbbször egy másik alkalmazás) számára fekete dobozként viselkedik Jól meghatározott interfészeken keresztül érhetı el katona.krisztina@nik.bmf.hu 4 A webszolgáltatások elınyei Szabványos internet protokollokon keresztül érhetı el XML-en alapuló, nyílt szabványokra épül Rendszertıl, nyelvtıl és megvalósítástól független Leírható, közzétehetı, felkutatható katona.krisztina@nik.bmf.hu 5 Szolgáltatásközpontú rendszerek A webszolgáltatások fejlıdésének korai szakaszában létrejött minta Serivce-oriented Architecture, SOA A szabványok és protokollok ezen minta alapján jöttek létre Szolgáltatásjegyzék Közzétesz Keres Szolgáltató Szolgáltat Igénybe vesz Szolgáltatást igénybe vevı katona.krisztina@nik.bmf.hu 6 2
Szabványok és protokollok A szolgáltatását a készítı közzéteheti egy jegyzékben A jegyzékben a szolgáltatást igénylı kutathat Felderítés UDDI, DISCO Leírás WSDL UDDI: Universal Description, Discovery and Integration Webszolgáltatások jegyzéke Több szempont szerint kereshetı (szolgáltatás, cégnév, telephely) Lehet nyilvános, vagy cégen belüli DISCO: a discovery (felfedezés) szóból A Microsoft megoldása szolgáltatások hirdetésére Üzenet Átvitel HTTP, SMTP, katona.krisztina@nik.bmf.hu 7 Szabványok és protokollok Ha az igénylı megtalálta a megfelelı szolgáltatást, tudnia kell, hogy hol, és milyen néven érhetı el a szolgáltatás, milyen bemeneti paramétereket vár, mit ad vissza. Felderítés UDDI, DISCO Leírás WSDL Üzenet WSDL: Web Services Description Language A kérés és a válasz leírását adja meg Átvitel HTTP, SMTP, katona.krisztina@nik.bmf.hu 8 Szabványok és protokollok Az üzenetet el kell küldeni a szolgáltatónak, ami az adatokat feldolgozva válaszüzenetet küld Felderítés UDDI, DISCO Leírás WSDL : Simple Object Access Protocol Üzenetek küldésére használt protokoll Üzenet Átvitel HTTP, SMTP, Az eddigi protokollok és szabványok az XML (Extensible Markup Language) nyelven alapulnak katona.krisztina@nik.bmf.hu 9 3
Szabványok és protokollok Az üzeneteket át kell vinni a hálózaton keresztül a szolgáltató és a szolgáltatást igénybevevı között A független az átvitel típusától A legtipikusabb a HTTP (Hypertext Transfer Protocol) Ha a kérések és a válaszok összhangja nem fontos, akkor az SMTP (Simple Mail Transfer Protocol) is kiváló eszköz a üzenetek továbbítására Felderítés UDDI, DISCO Leírás WSDL Üzenet Átvitel HTTP, SMTP, katona.krisztina@nik.bmf.hu 10 Webszolgáltatások megvalósítása.net-ben Logikai kapcsolat Ügyfélalkalmazás Webszolgáltatás Proxy osztály IIS/ASP.NET HTTP HTTP TCP/IP TCP/IP Fizikai kapcsolat katona.krisztina@nik.bmf.hu 11 Webszolgáltatás felhasználása Egy webszolgáltatás felhasználója bármilyen típusú program lehet (konzolalkalmazás, Windows alkalmazás, webalkalmazás ) A felhasználó nem kell hogy ismerje a szolgáltatás megvalósításának részleteit A kérés és a válasz protokollját, valamit az üzenet struktúráját a WSDL leíró nyelven megadott dokumentum tartalmazza Az alkalmazásfejlesztı környezetek általában képesek létrehozni egy un. proxy osztályt (ügyfélcsonkot) katona.krisztina@nik.bmf.hu 12 4
A proxy osztály (ügyfélcsonk) Elkülöníti a és a hálózati protokollokkal kapcsolatos rétegeket az alkalmazástól Egy hagyományos osztály, amely visszatükrözi a webszolgáltatás mőködését Mindenegyes proxy osztálybeli metódus bemeneti paraméterei és visszatérési értéke megegyezik a vele azonos webszolgáltatásbeliekkel A fejlesztı a szolgáltatás meghívását és a válasz fogadását a proxy osztály metódusán keresztül végzi, nem szükséges ismernie az egyéb szabványokat és protokollokat katona.krisztina@nik.bmf.hu 13 Webszolgáltatás felhasználása.net-ben Proxy osztályt legegyszerőbben úgy kapunk, ha a szolgáltatás elérhetıségét web referenciaként a projekthez adjuk A wsdl.exe parancssori eszközzel tudunk sajátos igényeknek megfelelı proxy osztályt létrehozni Adjuk meg az elérhetıséget Kattintsunk a Go gombra Adjuk meg a referencia nevét Kattintsunk az Add Reference gombra A Reference.cs fájlban található a proxy osztály, amely a projektnév.referencianév névtérben helyezkedik el és neve a webszolgáltatás neve katona.krisztina@nik.bmf.hu 14 Webszolgáltatás felhasználása.net-ben A szolgáltatás neve Meghívható metódusok A szolgáltatás címét a böngészıbe beírva, a meghívható metódusok megjelennek, azokat kipróbálhatjuk. katona.krisztina@nik.bmf.hu 15 5
Feladat Készítsünk alkalmazást, amely megjeleníti az aktuális idıjárást egy megadott városban. Az adatokat egy webszolgáltatótól kérjük le. Megoldási ötletek: Keressünk webszolgáltatás-keresıt Keressünk rá idıjárás-szolgáltatókra Ellenırizzük, hogy létezik-e a WSDL leírás Adjuk meg a web referenciát A proxy osztály segítségével hívjuk meg a szolgáltatást katona.krisztina@nik.bmf.hu 16 Megoldás egy lehetséges eset A kiválasztott szolgáltatás címe: http://www.webservicex.com/globalweather.asmx A Reference.cs fájlt megnézve, vagy az IntelliSense-re hagyatkozva Példányosítjuk a proxy osztályt, Meghívjuk a metódusát (miáltal meghívódik a távoli metódus) Proxy osztály WeatherService.GlobalWeather weather = new WeatherService.GlobalWeather(); string response = weather.getweather(textboxcity.text, textboxcountry.text); MessageBox.Show(response); A szolgáltatás meghívása katona.krisztina@nik.bmf.hu 17 XML - áttekintés Az eredmény XML formátumban van Az anyagnak nem célja az XML ismertetése, az itt következı rész, csak egy kis áttekintés, hiszen a webszolgáltatások alapja az XML sokszor a válasz formátuma is ez katona.krisztina@nik.bmf.hu 18 6
XML - áttekintés XML = Extensible Markup Language Olyan információ és szolgáltatás kódolására alkalmas struktúra és tartalom, amely mind ember, mind számítógép számára értelmezhetı. XML dokumentum Az XML dokumentum egy bevezetıvel indul (legtöbbször a verziószámot és a kódolás típusát tartalmazza), ezt követi a gyökérelem, és ezt a többi elem egymásba ágyazva. Az elemek nyitó-, zárótagbıl és a köztük elhelyezkedı tartalomból állnak. XML séma Az XML dokumentumok struktúrájára és a tartalom megkötéseinek leírására szolgáló nyelv. Az ilyen fájlok kiterjesztése xsd. katona.krisztina@nik.bmf.hu 19 Feladat Az elıbb bemutatott webalkalmazás megadja, hogy egy adott országban mely városokról szolgáltat adatokat. Használjuk ezt ki a városok megadásánál. katona.krisztina@nik.bmf.hu 20 Megoldás egy lehetséges eset Az elızı módon meghívjuk a megfelelı metódust, ami egy sztringet ad vissza Az sztringrıl tudjuk, hogy XML formátumban van Az XML dokumentumból lekérjük a City nevő tageket. Egy tömböt kapunk. A tömbbıl kiíratjuk a városokat. katona.krisztina@nik.bmf.hu 21 7
Megoldás egy lehetséges eset WeatherService.GlobalWeather weather = new WeatherService.GlobalWeather(); string response = weather.getcitiesbycountry(textboxcountry.text); az eredményt bájttömbbé konvertáljuk, hogy byte[] responsebytes = Encoding.UTF32.GetBytes(response); Streambe tehessük System.IO.MemoryStream ms = new System.IO.MemoryStream(responseBytes); System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.load(ms); System.Xml.XmlNodeList elemlist = doc.getelementsbytagname("city"); a MemoryStreambıl tudjuk kiolvasni az XML-adatokat az XML dokumentum reprezentációja a memóriában foreach (System.Xml.XmlNode node in elemlist) comboboxcities.items.add(node.innertext); comboboxcities.text = comboboxcities.items[0].tostring(); a "City" nevő tagek kinyerése a City nevő tagek tömbjén végigmenve feltöltjük a comboboxot a városok neveivel katona.krisztina@nik.bmf.hu 22 Feladat Tegyük felhasználóbaráttá a programot Kezeljük a nemvárt eseteket katona.krisztina@nik.bmf.hu 23 Házi feladat Készítsünk egy dll-t, mely vicceket tárol, és kérésre ad egyet közülük. A következı órai webszolgáltatásnak ez lesz a logikai alapja. katona.krisztina@nik.bmf.hu 24 8
Webszolgáltatások Webszolgáltatások készítése Tartalom ASP.NET webszolgáltatás létrehozása Visual Studio 2005-tel Egyszerő tesztelési lehetıségek Kivételkezelés Telepítési módok Közzététel katona.krisztina@nik.bmf.hu 26 Webszolgáltatások megvalósítása.net-ben Logikai kapcsolat Ügyfélalkalmazás Webszolgáltatás Proxy osztály IIS/ASP.NET HTTP HTTP TCP/IP TCP/IP Fizikai kapcsolat katona.krisztina@nik.bmf.hu 27 9
Feladat Készítsünk webszolgáltatást, amely kérésre ad egy viccet. Használjuk a házi feladatként elkészített dll-t. katona.krisztina@nik.bmf.hu 28 A vicc-osztó feladat logikája egy lehetséges megoldás A Jokes.dll biztosítja a vicceket. Mely kategóriánként egy-egy szövegfájlból olvassa ki a vicceket. A viccek között egy-egy üres sor kell hogy legyen. A JokeSelection osztály példányosításkor kapja meg a szövegfájlok elérési útját. A JokeSelection osztály szolgáltatandó metódusai: GetAJoke: adott kategóriából az adott számú viccet adja vissza szövegként NumOfJokes: adott kategóriában található viccek számát adja vissza int típusként A metódusok által dobható kivételek: NoJokeException EmptyFileException A Category felsorolás tartalmazza a viccek kategóriáit katona.krisztina@nik.bmf.hu 29 A Jokes.dll tartalma katona.krisztina@nik.bmf.hu 30 10
ASP.NET webszolgáltatás létrehozása Visual Studio 2005-tel New Web Site ASP.NET Web Service Ha helyét a fájlrendszerben adjuk meg, akkor teszteléskor a VS által generált IIS szerveren fut a szolgáltatás A létrejött fájlok asmx fájl: ez reprezentálja a webszolgáltatást, amely az URI-jével elérhetı mögöttes kód: ez adja meg a program mőködését A fájlok és az osztály nevét célszerő beszédesre megváltoztatni katona.krisztina@nik.bmf.hu 31 A fájlok tartalma asmx fájl: <%@ WebService Language="C#" CodeBehind="~/App_Code/JokeProviderService.cs" Class="JokeProviderService" %> a lap feldolgozásához ad információt mindig a <%@ WebService %> között van mögöttes kód: [WebService(Namespace = "http://www.nik.hu/hp/")] public class JokeProviderService : System.Web.Services.WebService [WebMethod(Description="Adott kategóriában, az adott sorszámú viccet adja.")] public string GetAJoke(Category category, int number) A metódus elıtti WebMethod attribútum jelzi hogy elérhetı a webszolgáltásban Az osztályban más metódusok is lehetnek katona.krisztina@nik.bmf.hu 32 Kiegészítések a szolgáltató osztályhoz A WebService attribútumnál a szolgáltatás fontos beállításai adhatók meg: névtér: figyelem!, nem azonos a.net névtérrel Az XML névtér a dokumentum elemeinek egyedi azonosítását szolgálja, általában egy URL Ezért írjuk át a saját cégünk webcímére név leírás [WebService(Namespace = "http://www.nik.hu/hp/")] public class JokeProviderService : System.Web.Services.WebService [WebMethod(Description="Adott kategóriában, az adott sorszámú viccet adja.")] public string GetAJoke(Category category, int number) A webszolgáltatás osztályának nem feltétlen kell a WebService osztályból származnia, de így kihasználhatjuk az ASP.NET-adta elınyöket, a fejlesztés egyszerőbb; a származtatás ajánlott katona.krisztina@nik.bmf.hu 33 11
Egyszerő tesztelési lehetıségek A webszolgáltatás futtatásakor (ha a projektet a fájlrendszerben hoztuk létre) a VS generál egy IIS szervert Ilyenkor egy böngészı nyílik, amelyben a webszolgáltatás metódusai elérhetık Teszteléshez megírhatjuk a webszolgáltatást felhasználó alkalmazást, ekkor: a portszámot állítsuk fixre a szolgáltatás projektjének tulajdonságai között így ha már fut a virtuális szerver, akkor a webszolgáltatás felhasználásánál tanultak alapján a másik projektben (akár solutionben) használhatjuk a webszolgáltatásunkat katona.krisztina@nik.bmf.hu 34 Kivételkezelés Fault: kliens esetén az ASP.NET ilyen hibát küld, melynek mezıi: faultcode: kötelezı, karakterlánc általában a hibakódok egyikével kezdıdik: Server: a hiba a szerverben volt, az üzenet újbóli elküldése sikerre vezethet Client: a hiba az üzenet tartalmában vagy formátumában van, nem érdemes újra próbálkozni faultstring: olvasható formában írja le a hiba okát faultactor: tájékoztat, hogy hol következett be a hiba az üzenet útja során katona.krisztina@nik.bmf.hu 35 Kivételkezelés Ha a webszolgáltatás minden kivételt elkap, és helyettük SoapException-t dob, akkor az ASP.NET ennek alapján tölti ki a Fault mezıit Code tulajdonság -> faultcode Message tulajdonság -> faultstring Actor tulajdonság -> faultactor Így saját hibakódokat küldve elérhetjük, hogy a kliensalkalmazás megfelelı információhoz jusson Figyelem! A WSDL leírás nem tartalmaz információt a kivételekrıl, tehát a saját kivételeket külön kell dokumentálni katona.krisztina@nik.bmf.hu 36 12
Kivételkezelés szolgáltatói oldal try JokeSelection js = new JokeSelection(Server.MapPath("App_Data") + "//"); return js.numofjokes(category); catch (Exception ex) System.Xml.XmlQualifiedName code; if (ex is Jokes.NoJokeException) code = new System.Xml.XmlQualifiedName("Client.NoJoke"); else if (ex is Jokes.EmptyFileException) code = new System.Xml.XmlQualifiedName("Server.EmptyFile"); else code = SoapException.ServerFaultCode; throw new SoapException(ex.Message, code); A vicceket tartalmazó fájlok az App_Data mappában vannak. Minden kivételt elkapunk. A SoapException.Code tulajdonság nem szting hanem XmlQualifiedName példány. A Jokes.dll-ben két kivételt definiáltunk: NoJokeException és EmptyFileException. Ezeket SoapException-né alakítjuk. A többi kivételt alapértelmezett szerver hibaként kezeljük. A SoapExceptiont az üzenettel és a kóddal példányosítva dobjuk. katona.krisztina@nik.bmf.hu 37 Kivételkezelés felhasználói oldal try JokeProviderService.JokeProviderService js = new JokeProviderService.JokeProviderService(); Elkapjuk a SoapException catch (System.Web.Services.Protocols.SoapException ex) kivételeket. switch (ex.code.tostring()) A kivétel kódja nincs benne case "Client.NoJoke": a WSDL-ben, máshonnan MessageBox.Show(ex.Message); ismerjük. break; default: MessageBox.Show(ex.Code + "\n\n " + ex.message); break; katona.krisztina@nik.bmf.hu 38 Telepítési módok Másolás (Copy Web Site) A fájlokat és mappákat egy-az-egyben felmásolja a célszerverre Szinkronizációs eszközt is tartalmaz Website/Copy Web Site menüpont Publikálás (Publish Web Site) Elıfordítja a webszolgáltatást és a megadott helyre másolja az eredményt Build/Publish Web Site menüpont Telepítı alkalmazás készítése A.NET alkalmazások telepítése, Windows Installer (MSI) telepítıkészlet létrehozása részben leírtak szerint Csak a Setup and Deployment típusok közül a Web Setup Project sablont kell választani katona.krisztina@nik.bmf.hu 39 13
Közzététel UDDI (Universal Description, Discovery and Integration) A szolgáltatás megadásán kívül a szolgáltatóról is tartalmaz adatokat (név, elérhetıségek ) A szolgáltatás üzleti besorolása is megadható DISCO (discovery) A Microsoft fejlesztése Tartalmazhat: Hivatkozást webszolgáltatások leírására Hivatkozást más DISCO fájlra katona.krisztina@nik.bmf.hu 40 Közzététel DISCO A szolgáltatások leírása egy.disco kiterjesztéső XML fájlban van A fájlban lévı leírások hivatkozás hozzáadásával (References/Add Web Reference) és a disco fájl megadásával érhetık el katona.krisztina@nik.bmf.hu 41 Feladat Az elkészített vicc-osztó webszolgáltatásban oldjuk meg a kivételek kezelését Telepítsük a szolgáltatást Tegyük közzé A közzétett szolgáltatások közül egyet használjuk, és nevessünk a viccein katona.krisztina@nik.bmf.hu 42 14
Ajánlott irodalom XML összefoglaló Steve Graham et al: Java alapú webszolgáltatások Webszolgáltatások bevezetı John Sharp: Visual C# 2005 lépésrıl lépésre Webszolgáltatások angolul A. Freeman, A. Jones: Microsoft.NET XML Web Services Step by Step Telepítés http://msdn2.microsoft.com/en-us/library/7hd4c0x3(vs.80).aspx XML adatkezelés http://msdn2.microsoft.com/en-us/library/hf9hbf87(vs.80).aspx http://forums.devx.com/archive/index.php/t-16677.html katona.krisztina@nik.bmf.hu 43 15