Haladó Programozás Windows Communication Foundation WCF SOAP webszolgáltatás, hoszt és ügyfél elkészítése Kivételkezelés (nem tananyag) OE-NIK HP
Haladó Programozás Windows Communication Foundation WCF SOAP webszolgáltatás, hoszt és ügyfél elkészítése Kivételkezelés (nem tananyag) OE-NIK HP
Windows Communication Foundation Elosztott rendszerek készítéséhez kifejlesztett API A .NET 3.0-ban jelent meg A korábbi, egymástól független elosztott technológiákat integrálja Korábban használt, elavultabb: DCOM, .NET remoting Jelenleg használt, javasolt: SOAP, REST, Microsoft Azure Jellemzői Teljesen integrált biztonsági modell (használhatóak a beépített Authentication/Authorization providerek) Munkamenetszerű állapotkezelési módszerek és egyirányú, állapot nélküli üzenetek támogatása A hívó és a hívott oldalról is csak osztályok és azok metódusai látszódnak, a tényleges HTTP kommunikációt a keretrendszer teljesen elrejti OE-NIK HP
A WCF-alkalmazás részei Kliens alkalmazás WCF-hoszt Proxy WCF-szolgáltatás Konfigurációs állomány Konfigurációs állomány Érdemes az összeköttetéssel kapcsolatos információkat *.config fájlban tárolni, hiszen ebben az esetben a kapcsolat megváltoztatása csak a fájl átírását jelenti. Ha IIS-t használunk a szolgáltatás hosztolására, nem kell egyedi hosztot készíteni. OE-NIK HP
A WCF-alkalmazás részei WCF szolgáltatás Általában egy DLL, amely a funkcionalitást képviselő osztályokat és interfészeket tartalmaz Attribútumokkal jelöljük meg azokat az osztályokat/interfészeket, amik leírják a szolgáltatást; illetve azokat a metódusokat, amik távolról meghívhatóak WCF szolgáltatás hoszt Ez hosztolja (futtatja) a szolgáltatást SOAP esetén bármilyen .NET végrehajtható állomány lehet (konzol, WPF) REST esetén tipikusan egy IIS-ben futó webes alkalmazás (ez SOAP-nál is lehetséges) WCF-ügyfél Hozzáfér és használja a szolgáltatás funkcionalitását egy közbeépülő proxyn keresztül Bármilyen .NET alkalmazás lehet OE-NIK HP
A WCF ABC-je A hoszt és a kliens kommunikációjához az alábbiak megadása szükséges: Address (cím): a szolgáltatás elérésének címe Séma://<gépnév>[:port]/útvonal alakban pl. http://localhost:8080/MyService Binding (kötés): hálózati protokoll, kódolási mechanizmus, szállítási réteg megadása Pl. WSHttpBinding webszolgáltatásokhoz NetTcpBinding több gépen futó .NET-alkalmazások között Contract (szerződés): a szolgáltatás mások által elérhető metódusainak leírása Szolgáltatásszerződés: olyan .NET interfész, amely WCF-szerződést jelképez OE-NIK HP
Haladó Programozás Windows Communication Foundation WCF SOAP webszolgáltatás, hoszt és ügyfél elkészítése Kivételkezelés (nem tananyag) OE-NIK HP
WCF SOAP webszolgáltatás elkészítése Válasszuk a WCF Library projektet Így megkapjuk a szolgáltatás vázát ServiceContract Interfész, amely a szolgáltatás metódusait tartalmazza Minden kipublikálandó metódust a OperationContract attribútummal kell ellátni Érdemes az egyediség kedvéért névteret megadni (tipikusan a készítő webcíme) Pl. [ServiceContract(Namespace="http://nik.uni-obuda.hu/hp")] DataContract Az átadni kívánt adattípus Publikus tagjait DataMember attribútummal kell ellátni Szolgáltatás osztály Ez tartalmazza a szolgáltatás funkcionalitását Megvalósítja a ServiceContractnál megadott interfészt OE-NIK HP
A szolgáltatás tesztelése A Visual Studio egy WCF Test Client-et hoz létre, amellyel kipróbálhatjuk a szolgáltatás metódusait Ehhez szüksége van az App.Config fájlra, amely szintén nem szokványos egy DLL-ben A metódusra duplán kattintva beírhatjuk a megfelelő paramétereket, majd az Invoke gombbal a metódust futtathatjuk OE-NIK HP
App.config fájl Tartalmazza a kommunikációhoz szükséges információkat Cím, kötés, szerződés (ABC) MEX: Metadata Exchange (metaadatcsere) WCF szolgáltatási viselkedés, amellyel beállíthatjuk, hogy a futtatókörnyezet hogyan kezelje a szolgáltatást. Az ügyfél proxy osztályának generálásához szükséges megadni. Általában automatikusan frissül, de bizonyos esetekben kézzel kell beálítani Szerkesztés varázslóval App.config fájlon jobb katt: Edit WCF configuration Services: a szolgáltató osztály neve Host: a szolgáltatás IP címe Endpoints: ABC és MEX adatok Valójában egy XML fájl OE-NIK HP
App.config fájl ABC a cím a baseAddress-ben. A kötésből látszik, hogy webszolgálatás MEX végpont engedélyezése Viselkedésdefiníció a MEX-nek. OE-NIK HP
A hoszt elkészítése Szükséges hozzá a System.ServiceModel dll Referenciaként hozzá kell adni Az App.Config fájlra itt lesz szükség, másoljuk át, a dll-ből töröljük A hoszt példányosítása a szolgáltatás típusának megadásával ServiceHost host = new ServiceHost(typeof(EightBallService)) A szolgáltatás megnyitjuk, majd a végén bezárjuk using: definiálja az objektum hatókörét, ezen kívül az objektum felszabadul OE-NIK HP
Ügyfél elkészítése A megoldás menete megegyezik azzal, mint amikor egy webszolgáltatásra iratkozunk fel A hosztnak futnia kell a proxy osztály generálása alatt Lehetséges alternatíva: több startup projekt beállítása a solution-höz OE-NIK HP
Feladat Készítsünk egy jósló szolgáltatást (The Magic Eight Ball), a szolgáltatást hosztoljuk és vegyük igénybe A kérdező neve és születési dátuma alapján kiválaszt egyet az előre megadott válaszok közül A szolgáltatás egyetlen metódust ad Ennek egyetlen paramétere a személy adatait tartalmazó objektum A hoszt legyen konzolalkalmazás A metódus meghívása történhessen aszinkron módon OE-NIK HP
Megoldás A szolgáltatás elkészítése A hoszt lekészítése WCF Service Library -> EightBallDLL Szerződés -> IEightBallService Funkcionalitás -> EightBallService A hoszt lekészítése Console Application -> EightBallHost Szolgáltatási ABC -> App.Config fájl Ügyfél elkészítése Windows Form/Console Application -> EigthBallConsumer OE-NIK HP
Gyakorló feladatok Készítsünk egy szolgáltatást, amellyel éttermekhez tartozó pontszámokat kérhetünk le, és pontozhatjuk az éttermeket. A szolgáltatást hosztoljuk és vegyük igénybe. A szolgáltatás adja meg, hogy milyen éttermekről tartalmaz adatot Egy étterem megadására adja meg a hozzá tartozó értéket Készítsünk egy szolgáltatást, amellyel naplóbejegyzéseket lehet központi helyen tárolni, illetve lekérdezni Egy bejegyzés áll egy programnévből, időpontból, valamint szövegből A bejegyzések XML file-ban tárolódjanak A Read(string programname) metódus ezt az XML-t dolgozza fel OE-NIK HP
Haladó Programozás Windows Communication Foundation WCF SOAP webszolgáltatás, hoszt és ügyfél elkészítése Kivételkezelés (nem tananyag) OE-NIK HP
Kivételkezelés WCF-ben Ha nem kezeljük a hibákat, akkor azok a szerverről a kliensre kerülnek. A kliens futása leáll a következő hibaüzenettel: CommunicationException - the server did not provide a meaningful reply; this might have been caused due to a contract mismatch, a premature session shutdown or an internal server error. Egy ilyen után a kommunikációs csatorna nem használható tovább. A kommunikációs csatorna fenntartásához a SOAP-nak megfelelő kivételkezelést kell alkalmazni. Ennek lehetőségei: returnUnknownExceptionsAsFaults / [ServiceBehavior(IncludeExceptionDetailInFaults=true)]: Minden kivétel becsomagolódik és mint Soap Fault átkerül a kliensre. Érzékeny adatokat is átküld, így csak debugolásnál ajánlott használni IErrorHandler Minden kivételt elkapunk a szerveren, naplózzuk és esetleg továbbdobjuk Fault Exception-ként FaultException (FaultContract szerződés az eddigi ABC mellett) OE-NIK HP
SOAP Fault Bármilyen objektum becsomagolható ezzel Soap Faulttá A SOAP-ban definiált hibával kapcsolatos mezők: 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 A FaultException a WCF-ben definiált típus a Soap Fault létrehozására Bármilyen objektum becsomagolható ezzel Soap Faulttá new FaultException<MyFaultException>(myfe,faultReason,faultCode); myfe: becsomagolandó objektum faultReason: további információ küldése a kivételről faultCode: megfelel a SOAP feultcode mezőjének OE-NIK HP
Kivételkezelési információk a szerződésben A WCF szerződésnek tartalmaznia kell a kivételkezelésre vonatkozó információkat [OperationContract] [FaultContract(typeof(SomeCustomFaultException))] double GetBMI(double weight, double height); Ha a szerződés nem tartalmazza a FaultContract információt, akkor a kliens mindent UnknowFaultException kivételként kap el A FaultContract információ megjelenik a szolgáltatás wsdl-jében Saját objektumot érdemes átdobni, hogy a megfelelő adatokat adjuk át A átdobandó objektum osztályát a szerződésben definiáljuk [DataContract] public class SomeCustomFaultException { [DataMember] public string Message{get;set;} } OE-NIK HP
Kivétel dobása és elkapása A saját objektum létrehozása utána A FaultException generikus osztályból hozunk létre egy példányt Érdemes megadni a faultreasont és a faultcode-ot is SomeCustomFaultException error = new SomeCustomFaultException(); error.Message = "Zero value passed for height“; throw new FaultException<SomeCustomFaultException>( error, new FaultReason(ex.StackTrace), new FaultCode("Client.DivideByZero")); A kivétel elkapása a szokásos módon történik catch (System.ServiceModel.FaultException< ServiceReference.SomeCustomFaultException> fex) OE-NIK HP
OE-NIK HP
OE-NIK HP