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
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
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 SOAP Á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 SOAP 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 SOAP: Simple Object Access Protocol Üzenetek küldésére használt protokoll Üzenet SOAP Átvitel HTTP, SMTP, Az eddigi protokollok és szabványok az XML (Extensible Markup Language) nyelven alapulnak katona.krisztina@nik.bmf.hu 9
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 SOAP 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 SOAP üzenetek továbbítására Felderítés UDDI, DISCO Leírás WSDL Üzenet SOAP Á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 SOAP SOAP 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
A proxy osztály (ügyfélcsonk) Elkülöníti a SOAP é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
FIGYELEM! Az előbbi megoldás Visual Studio 2008-ban csak a szinkron metódushívásnál alkalmazható, ugyanis nem generálódik le a BeginXXX és EndXXX metódus. Aszinkron metódushíváshoz a wsdl parancssori programot kell használni. Ennek mikéntjét lásd később. katona.krisztina@nik.bmf.hu 16 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 17 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 18
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 19 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 20 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 21
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 22 Megoldás egy lehetséges eset WeatherService.GlobalWeather weather = new WeatherService.GlobalWeather(); string response = weather.getcitiesbycountry(textboxcountry.text); System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.loadxml(response); System.Xml.XmlNodeList elemlist = doc.getelementsbytagname("city"); foreach (System.Xml.XmlNode node in elemlist) comboboxcities.items.add(node.innertext); comboboxcities.text = comboboxcities.items[0].tostring(); Az XML dokumentum reprezentációja a memóriában Az XML dokumentumba betöltjük a kaptott eredményt 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 23 Megoldás XLINQ-val* A megoldás legalább 3.5-ös.NET keretrendszert igényel. A declaratív leírás elemei a System.Linq névtérben találhatók. Az XLINQ használatához szükségünk van a System.XML.Linq assembly-re és azon belül a System.XML.Linq névtér osztályaira WeatherService.GlobalWeather weather = new WeatherService.GlobalWeather(); string response = weather.getcitiesbycountry(textboxcountry.text); XElement elem = XElement.Parse(response); IEnumerable<string> citynames = from city in elem.elements("table") select (string)city.element("city"); forreach (string city in citynames) comboboxcities.items.add(city); comboboxcities.text = comboboxcities.items[0].tostring(); Az XML dokumentum reprezentációja a memóriában Deklaratív módon lekérjük a City nevű tagek adatait. A kapott eredményeken végigmenve feltöltjük a comboboxot a városok neveivel katona.krisztina@nik.bmf.hu 24
LINQ és XLINQ ízelítő egy nagy témából Language-Integrated Query Általános lekérdező funkció hozzáadása a keretrendszerhez Probléma nélkül integrálódik az eddigi.net nyelvekhez Osztályokkal, SQL és XML adatokkal is használható DLINQ = LINQ to SQL XLINQ = LINQ to XML string[] names = "John", "Peter", "Joe", "Patrick", "Donald", "Eric"; IEnumerable<string> nameswithfivecharacters = from name in names where name.length < 5 select name; listbox1.items.clear(); foreach(string name in nameswithfivecharacters) listbox1.items.add(name); katona.krisztina@nik.bmf.hu 25 Feladat Tegyük felhasználóbaráttá a programot Kezeljük a nem várt eseteket katona.krisztina@nik.bmf.hu 26 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 27
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 29 Webszolgáltatások megvalósítása.net-ben Logikai kapcsolat Ügyfélalkalmazás Webszolgáltatás Proxy osztály IIS/ASP.NET SOAP SOAP HTTP HTTP TCP/IP Fizikai kapcsolat TCP/IP katona.krisztina@nik.bmf.hu 30
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 31 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 32 A Jokes.dll tartalma katona.krisztina@nik.bmf.hu 33
ASP.NET webszolgáltatás létrehozása Visual Studioval 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 34 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 35 Kiegészítések a szolgáltató osztályhoz [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 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 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 36
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 37 Kivételkezelés SOAP Fault: SOAP 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 38 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 SOAP 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 39
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 sztring 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 40 Kivételkezelés felhasználói oldal try JokeProviderService.JokeProviderService js = new JokeProviderService.JokeProviderService(); catch (System.Web.Services.Protocols.SoapException ex) switch (ex.code.tostring()) case "Client.NoJoke": MessageBox.Show(ex.Message); break; default: MessageBox.Show(ex.Code + "\n\n " + ex.message); break; Elkapjuk a SoapException kivételeket. A kivétel kódja nincs benne a WSDL-ben, máshonnan ismerjük. katona.krisztina@nik.bmf.hu 41 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 42
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 43 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 44 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 45
Webszolgáltatások Webszolgáltatások felhasználása aszinkron metódushívással Aszinkron metódushívás Ismétlés delegate «visszatérési típus» Képviselő(«paraméterek»); Képviselő k = new Képviselő(«hívandó metódus»); IAsyncResult «objektum» = k.begininvoke(«paraméterek»); //...tetszőleges kód, amely a képviselt metódussal párhuzamosan fut majd «visszatérési típus» eredmény = k.endinvoke(«objektum»); A BeginInvoke meghívására egy külön szálon elindul a <<hívandó metódus>> végrehajtása A végrehajtással párhuzamosan tetszőleges kódot futtathatunk Az EndInvoke meghívásakor a <<hívandó metódus>> befejezéséig blokkolódik a program, majd megkapjuk a metódus visszatérési értékét A BeginInvoke és az EndInvoke között az összekötő az IAsyncResult egy példánya katona.krisztina@nik.bmf.hu 47 Aszinkron metódushívás Hollywood stílusban Nincs meghatározva, hol várunk a metódus befejezésére A metódus befejeződéséről egy úgynevezett callback képviselő értesít. Vagyis végrehajtódik a képviselőhöz adott metódus. A képviselőt a BeginInvoke utolsó előtti paramétereként adhatjuk meg Az EndInvoke metódust a képviselőhöz adott metódusban hívjuk meg private void CallBack(IAsyncResult ar) response = email.endinvoke(ar); IAsyncResult ar = email.begininvoke( request, new AsyncCallback(CallBack), null); katona.krisztina@nik.bmf.hu 48
Aszinkron metódushívás webszolgáltatásoknál A Visual Studio 2008 esetében a parancssori wsdl paranccsal elkészítjük a webszolgáltatáshoz tartozó proxy osztályt Paraméterként meg kell adni az osztály nyelvét és a webszolgáltatás wsdl fájljának elérési útját wsdl /l:cs http://.../xwebemailvalidation.wsdl A proxy osztály tartalmaz egy BeginWebszolgNév és egy EndWebszolgNév metódust, amelyek ugyanúgy viselkednek, mint az aszinkron metódushívásnál megismert BeginInvoke és EndInvoke metódusok katona.krisztina@nik.bmf.hu 49 Feladat Készítsünk egy regisztrációs formot, amely email címet és egyéb adatokat kér a felhasználótól A regisztráló csak akkor mehet tovább az oldalról, ha a megadott email címe valós Keressünk webszolgáltatást, amely az email címek valódiságát ellenőrzi A cím ellenőrzése alatt a regisztráló legyen képes az adatlap többi részét kitölteni katona.krisztina@nik.bmf.hu 50 Megoldás egy lehetséges eset 1. Email cím ellenőrzés található az alábbi helyen: http://ws.xwebservices.com/xwebemailvalidation/v2/ XWebEmailValidation.wsdl A szolgáltatásról információk itt http://www.xwebservices.com/web_services/xwebe mailvalidation/ Használjuk a wsdl programot a proxy osztály elkészítéséhez wsdl /l:cs http://ws.xwebservices.com/xwebemailvalidation/v2/xweb EmailValidation.wsdl katona.krisztina@nik.bmf.hu 51
Megoldás egy lehetséges eset 2. Az elkészült EmailValidation.cs fájlt adjuk a projekthez A fájl tartalma EmailValidation proxy osztály BeginValidateEmail és EndValidateEmail metódusokkal ValidateEmailRequest a kérés paramétereihez ValidateEmailResponse osztály a válaszhoz ValidateEmailResponseStatus felsorolás mutatja a cím helyességét A System.Web.Services assembly-t adjuk a referenciákhoz katona.krisztina@nik.bmf.hu 52 EmailValidation email = new WSAsyncInv.EmailValidation(); private void ValidateAsync() ValidateEmailRequest request = new WSAsyncInv.ValidateEmailRequest(); request.email = textboxemail.text; IAsyncResult ar = email.beginvalidateemail(request, new AsyncCallback(CallBack), null); private void CallBack(IAsyncResult ar) ValidateEmailResponse response = email.endvalidateemail(ar); private void textboxemail_validating(object sender, CancelEventArgs e) ValidateAsync(); katona.krisztina@nik.bmf.hu 53 További felmerülő probléma Mivel aszinkron metódushívásnál a metódus és a callback metódus végrehajtása a Form szálától különböző szálon történik, ezért a vezérlők a fenti metódusokban nem módosíthatók Megoldás: minden vezérlőnek van egy Invoke metódusa, amely a paraméterként megkapott képviselőt a vezérlőt tulajdonló szálon futtatja Tehát: Készítsünk egy metódust, amely a vezérlőkön a webszolgáltatás befejezésekor elvégzendő feladatokat tartalmazza Készítsünk hozzá egy képviselőt Egy vezérlő Involke metódusán keresztül hívjuk meg a képviselőt katona.krisztina@nik.bmf.hu 54
A felmerült probléma megoldása delegate void RefreshDelegate(ValidateEmailResponseStatus status); private void CallBack(IAsyncResult ar) ValidateEmailResponse response = email.endvalidateemail(ar); RefreshDelegate refresh = RefreshForm; //new RefreshDelegate(RefreshForm); labelvalid.invoke(refresh,response.status); private void RefreshForm(ValidateEmailResponseStatus status) switch (status) case ValidateEmailResponseStatus.VALID: labelvalid.text = "OK"; break; case ValidateEmailResponseStatus.NOT_VALID: labelvalid.text = "Helytelen email cím"; break; default: labelvalid.text = "Nem sikerült az ellenőrzés"; break; katona.krisztina@nik.bmf.hu 55 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/enus/library/7hd4c0x3(vs.80).aspx XML adatkezelés http://msdn2.microsoft.com/enus/library/hf9hbf87(vs.80).aspx katona.krisztina@nik.bmf.hu 56 http://forums.devx.com/archive/index.php/t-16677.html