Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaBertalan Kerekes Megváltozta több, mint 10 éve
1
Készítette: Galán Mihály
2
Viselkedés szerződések definiálása Szolgáltatás szerződések és szolgáltatás típusok Hiba szerződések Üzenetcsere minták Szerkezeti szerződések definiálása Adat szerződések Kollekciók Üzenetszerződések
4
Maga a szolgáltatás hogyan viselkedik és ehhez milyen műveletek szükségesek. Mikor és milyen hiba léphet fel a szolgáltatásban. Mik azok a MEP követelmények, amik kölcsönhatásba lépnek a szolgáltatással? (kérés/válasz, egyirányú, duplex)
5
A szolgáltatás szerződés egy kollektív mechanizmus, melyben a szolgáltatás képességei és követelményei vannak specifikálva a fogyasztó számára. Ezek a mechanizmusok .NET interface típus Operációk a típuson belül .NET attribútumok ServiceContractAttribute OperationContractAttribute MessageParameterAttribute
6
[ServiceContract()] public interface ITaskManagerService { [OperationContract()] int AddTask (String taskDescription, string assignedTo) //stb… }
7
A System.ServiceModel namespace-ben definiált. Alkalmazható.NET interfésznél és osztálynál. Az attribútum nem származtatott. Deklarálható paraméter nélkül is.
8
Nevesített paraméterLeírás NameAz alapértelmezettől eltérő nevet definiál. Ez a szerződés név jelenik meg a portType névként, mikor a felhasználó hozzáfér a WSDL-hez. NamespaceA szolgáltatás számára egy cél névteret határoz meg a WSDL-ben. (Default: http://tempuri.org) CallbackContractCallback szerződésként társít egy újabb szolgáltatás szerződést. ProtectionLevelMegszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton) ConfigurationNameA szolgáltatás elem név attribútumát specifikálja a konfigurációs fájlban. SessionModeMeghatározza, hogy mely session-öket fedhet fel a végpontnál.
9
[ServiceContract(Name=„TaskManagerService”, Namespace = „http://schemas…”)] public interface ITaskManagerService { //stb… }
10
Szintén a System.ServiceModel namespace-ben definiált. Csak metódusoknál alkalmazható. A metódust úgy kell deklarálni, hogy a szolgáltatás szerződéshez tartozzon.
11
Nevesített paraméterLeírás NameAz alapértelmezettől eltérő nevet határoz meg. ActionControls the action header for messages to this operation. ReplyActionControls the action header for response messages from this operation. IsOneWayJelzi, hogy a művelet egyirányú és nem kap választ. ProtectionLevelMegszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton). IsInitiatingJelzi, ha a művelet új session-t kezdeményez a hívó és a szolgáltatás között. IsTerminatingJelzi, ha a művelet terminál egy létező session-t a hívó és a szolgáltatás között.
12
[ServiceContract()] public interface SomeCrudContract{ [OperationContract(IsOneWay = true, Action = „urn:crud:insert”)] void ProcessInsertMessage(Message message) [OperationContract(IsOneWay = true, Action =„urn:crud:update”)] void ProcessUpdateMessage(Message message) [OperationContract(IsOneWay = true, Action =„urn:crud:delete”)] void ProcessDeleteMessage(Message message) }
13
Szintén a System.ServiceModel namespace-ben definiált. Irányítja, hogyan az operációk paramétereinek a neve és a visszatérési értékek hogyan jelenjenek meg a szolgáltatás leírásban. Egyetlen paramétere van, ez pedig a Name paraméter.
14
[OperationContract()] [return: MessageParameter(Name=„responseString”)] string SomeOp([MessageParameter(Name=„string”] string s)
15
Hiba kontra kivétel A kivétel egy.NET mechanizmus, mely a futás során felmerülő problémákat kezeli. Throw, catch, ignore mechanizmusok Kezelni kell őket, különben a.NET terminálja azt a szálat, amelyikben a hiba történt. SOAP hiba mechanizmusra hivatkozik. A hibát vagy a hiba feltételeit a szolgáltatástól a felhasználóig szállítja. Megvan a bekövetkező hiba üzenetének a struktúrája.
16
Standard mechanizmus, mely a.NET kivételek és SOAP hibák között közvetít. FaultException: típus nélküli hiba adatot küld a felhasználónak. DaultExcepton : típusos adatot küld a felhasználónak. A TDetail jelenti a hiba információ típusát.
17
System.ServiceModel Megengedi a fejlesztőnek, hogy deklarálja, milyen hiba következhet be a szolgáltatás egyes operációinál. Tulajdonságok: Az attribútum csak a műveletnél alkalmazható. Nem származtatott. Többször alkalmazható.
18
[ServiceContract()] public interface ICalculatorService { [OperationContract()] [FaultContract(typeof(string))] double Divide(double numerator, double denominator); } public class CalculatorService : ICalculatorService { public double Divide(double numerator, double denominator){ if(denominator == 0.0d){ String faultDetail = „You cannot divide by zero”; throw new FaultException (faultDetail); } return numerator/denominator; }
19
Request/response OneWay Duplex
20
Legnépszerűbb üzenetváltási módszer. Egyszerűen beállítható. OperationContractAttribute: IsOneWay paraméter. Lehetővé teszi, hogy a szolgáltatás hibákat bocsásson ki vagy tranzakció kontextussal térjen vissza.
21
[ServiceContract()] public interface ILogisticsService { [OperationContract()] WorkOrderAcknowledgement SubmitWorkOrder(WorkOrder workOrder); [OperationContract()] void CancelWorkOrder(int workOderNumber); }
22
Ha csak egy üzenetet szeretnék küldeni. Nem érdekel a válasz. Beállítása: OperationContractAttribute IsOneWay property-jét kell „true”-ra állítani. Nem használható FaultContract attribútummal együtt. Miért? Sorbaállított üzenetküldés esetén.
23
[ServiceContract()] public interface ILogisticsService { [OperationContract(IsOneWay=true)] void CancelWorkOder(int workOrderNumber); }
24
Két helyzetben használatos: A kliens üzenetet küld a szolgáltatásnak, mert hosszú távú feldolgozást kezdeményezzen és megerősítést kér a szolgáltatástól, hogy a a kért feldolgozás megtörtént. A kliensnek tudni kell fogadnia kéretlen üzeneteket a szolgáltatástól.
25
[ServiceContract()] interface IGreetingHandler { [OperationContract(IsOneWay=true)] void GreetingProduced(string greeting); } [ServiceContract(CallbackContract = typeof(IGreetingHandler))] interface IGreetingService { [OperationContract(IsOneWay = true)] void RequestGreetng(string name); }
26
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] class GreetingService : IGreetService { public void RequestGreeting(string name) { Console.WriteLine(„In Service.Greet”); IGreetingHandler callbackHandler = OperationContext.Current.GerCallbackChannel (); callbackHandler.GreetingProduced(„Hello ” + name); }
28
Megegyezés a szolgáltatás és a felhasználó között az üzenetváltás során a hasznos adat formájáról és felépítéséről. Komplex típusok szerializálására. [OperationContract()] ResponseMessageType SomeOp1(RequestMessageType reqMsg); [OperationContract()] string SomeOp2(string el1, string el2);
29
DataContractAttribute használatával deklarálhatók az adat szerződések. A DataMemberAttribute segítségével lehet bevonni a típusokat a szerződésbe. Ez opcionális és független a láthatóságtól.
30
[DataContract(Namespace = „http://schemas.fabrikam.com/customers/”)]„http://schemas.fabrikam.com/customers/ public enum TitleOptions : int { [EnumMember()] Mr = 0, [EnumMember()] Ms = 1, [EnumMember()] Mrs = 2, [EnumMember()] Dr = 3, }
31
[DataContract(Namespace = „http://schemas.fabrikam.com/customers/”)] public class ContactInfo { [DataMember(IsRequired = false)] public string PhoneNumber; [DataMember(IsRequired = false)] public string EmailAddress; }
32
Enum, struktúra, osztály Nem származtatott Összesen két paramétere van.
33
ParaméterLeírás NameMeghatározza a nevet, ami a létrejövő sémában megjelenik. NamespaceBeállítja a sémában a cél névtere. Az alap: http:// schemas.datacontract.org/2004/07[CLR namespace]
34
System.Runtime.Serialization Azt határozza meg, hogy a tagnak benne kell-e lennie az adatszerkezet szerializációjában.
35
ParaméterLeírás NameA tagból generált séma elem nevét állítja be. Alapesetben a.NET típusnál ez a mező vagy property neve. IsRequiredminOccurs előfordulást szabályozza a sémában. Az alap értek false, ami azt jelenti, hogy az elem opcionális, azaz a minOccurs = 0. OrderAz elemek sorrendjét adja meg a sémában. EmitDefaultValueAzt adja meg, hogy melyik alapértelmezett értékeket vegye be a szerializációba. Alapértelmezetten true-ra van állítva.
36
Azt deklarálja, hogy egy megadott enum típus DataContractAttribute-tal deklarálva része legyen az adat szerződésnek. Egyetlen paramétere a Value, mely a szerializálásnál használható fel. Az alap érték a valódi érték.
37
DataContractSerializer az új WCF szerializáló. Opt-In módban működik, ami az elődjének (XMLSerializer) az ellentéte. DataContractSerializer esetén meg kell jelölni, hogy mely tagok legyenek az adat szerződés részei.
38
[Serializable()] public class ContactInfo { public string PhoneNumber; public string EmailAddress; [NonSerialized()] public string HomeAddress; }
39
[DataContract()] public class ContactInfo { [DataMember()] public string PhoneNumber; [DataMember()] public string EmailAddress; public string HomeAddress; }
40
[ServiceContract()] interface ITaskManager { [OperationContract()] List GetTasksByAssignedName (string name); }
41
[ServiceContract()] Interface ITaskManager { [OperationContract()] Task[] GetTasksBYAssignedName (string name); }
42
Csak akkor automatikus, ha a kollekció egy konkrét kollekció a szerződésben és szerializálható. Mi történik akkor, ha nem teljesül a feltétel? Megoldás: CollectionDatacontractAttribute
43
[CollectonDataContract(Name = „MyCollectionOf{0}”)] public class MyCollection : Ienumerable { public void Add(T item) { … } Ienumerator Ienumerable.GetEnumarator() { … } public Ienumerator GetEnumerator() { … } //… } [ServiceContract()] interface ITaskManager { [OperationContract()] MyCollection GetTaskByAssignedName(string name); }
44
Miután a kliens oldalon legenerálódott a proxy, a GetTasksByAssigned művelet visszatérési típusa így fog látszódni: [CollectionDataContract()] public class MyCollectionOfTask : List { }
45
[DataContract()] [KnownType(typeof(LoanApprovalTask))] class Task { //… } [DataContract()] class LoanApprovalTask : Task { //… }
46
[ServiceContract()] interface ITaskManager { [OperationContract()] List GetTasksByAssignedName (string name); }
47
Használat okai: Hogyan épüljön fel a SOAP test. Hogyan szerializálódjon. Szolgáltasson és hozzáférjen a headerökhöz. Attribútumok: MessageContractAttribute MessageHeaderAttribute MessageBodyMemberAttribute
48
ParaméterLeírás IsWrappedHa „true”, akkor az üzenet test tartalmaz egy wrapper elemet, mely az üzenet szerződés típusáról vagy a WrapperName-ről kapja a nevét. Ha „false”, akkor „unwrapped”, és a test elemei közvetlenül alatta jelennek meg. ProtectionLevelMegszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton) WrapperNameEllátja névvel a test „wrapper” elemet. WrapperNamespaceElltája névtérrel a test „wrapper” elemet.
49
ParaméterLeírás NameA szerializált header elem nevét adja meg. NamespaceNévtérrel látja el a header-t és a gyerekeit, kivéve ha típus szinten felül van írva. ProtectionLevelMegszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton) ActorAz URI értéke jelzi, hogy melyik actor a tervezett célja a header-nek. MustUnderstandJelzi, hogy a header címzettjének fel kell-e dolgoznia azt. RelayJelzi, hogy továbbítania-e kell a következő címzettnek az üzenetet, ha az actor nem dolgozza fel.
50
ParaméterLeírás NameA szerializált test elem nevét felügyeli. NamespaceNévtérrel látja el a test elemet és a gyerekeit, kivéve ha típus szinten felül van írva. ProtectionLevelMegszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton) OrderAz elemek sorrendjét adja meg a sémában.
51
Control over Message Body Wrapping Supplying Custom Headers Saját védelmi mechanizmus esetén szükség van arra, hogy a saját autentikációnkat elhagyjuk egy privát SOAP header segítségével. A szolgáltatás felhasználóinak szüksége lehet valamilyen license kulcsra ahhoz, hogy futási időben hozzáférjenek a szolgáltatáshoz.
52
[DataContract()] public class ContactInfo { [DataMember()] public string PhoneNumber; [DataMember()] public string EmailAddress; } [ServiceContract()] public interface ISomeService { [OperationContract()] ContactInfo GetProviderContactInfo(); }
53
A szolgáltatás orientáltság egyik nagy előnye, hogy megkönnyíti a szolgáltatás elválasztását a felhasználótól. Ehhez verzió toleránsnak kell lennie. 3 lehetőség: Új tag hozzáadása az adat szerződéshez. Hiányzik egy tag az adat szerződésből. Támogatott a roundtripping
54
Mi történik akkor, ha egy v1.0 kliens beszélget egy v2.0 szolgáltatással, ami egy új tagot adott az adat szerződéshez, amiről a v1.0 kliens nem tud? Megoldás: IExtensibleDataObject interfész és az adat szerződés implementálási formája.
55
[DataContract(Namespace = „http://schemas.fabrikam.com/2008/04/tasks/”)] public class Task : IExtensibleDataObject { [DataMember(IsRequired=true, Order=1)] public string Description; //… public ExtensionDataObject ExtensionData { get { return _extensionData; } set { _extensionData = value; } } private ExtensionDataObject _extensionData; }
56
Két megoldás: DataContractSerializer XMLSerializer
57
Két attribútum a megvalósítására: XmlSerializerFormatAttribute DataContractFormatAttribute Mindkettőnek van Style property-je, amivel beállítható a SOAP stílusa: Rpc vagy Document. XMLSerializerFormatAttribute továbbá: Use property
58
[ServiceContract()] [XmlSerializerFormar(Style=OperationFormatStyle.Rpc, Use=OperationFormatUse.Encoded)] interface ISomeLegacyService { [OperationContract()] string SomeOp1(string name); } [ServiceContract()] [DataContractFormat(Style=OperationFormatStyle.Rpc)] interface ISomeRpcService2 { [OperationContract()] string SomeOp2(string name); }
59
Az alapértelmezett stílus: Document DataContractSerializer az alap szerializáló. Ha XMLSerializer-t akarunk használni, akkor azt deklarálni kell. XMLSerializerFormat Use attribútumánál a Literal az alapételmezett.
60
DataContractSerializer előnyei: Opt-In megközelítés jó irányíthatóságot biztosít az adat szerződések felett. gyors A DataContractSerializer képs XML-be szerializálni, azonban sok esetben az eredmény XML nem felel meg a szükségleteknek. XMLSerializer complex XML sémákat tud kezelni.
61
Lépések: XML séma megtervezése vagy létező minta használata. Kód generálása a sémából. Szolgáltatás szerződésben XmlSerializer használatának beállítása. Szolgáltatás műveletek deklarálása. /serializer.XmlSerializer opció használata a kliens proxy perspektívából.
62
Szerződés létrehozása interfész segítségével Szerződés implementálása Szolgáltatás létrehozása Kliens létrehozása Kliens konfigurálása Kliens használata
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.