62
2. ELŐADÁS SZERZŐDÉSEK Készítette: Galán Mihály

2. előadás Szerződések

  • Upload
    trent

  • View
    29

  • Download
    2

Embed Size (px)

DESCRIPTION

2. előadás Szerződések. Készítette: Galán Mihály. Miről lesz szó?. 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. - PowerPoint PPT Presentation

Citation preview

Page 1: 2. előadás Szerződések

2. ELŐADÁS

SZERZŐDÉSEK

Készítette: Galán Mihály

Page 2: 2. előadás Szerződések

Miről lesz szó?

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

Page 3: 2. előadás Szerződések

Viselkedési szerződések definiálása

Page 4: 2. előadás Szerződések

Szolgáltatás viselkedésének megadása

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)

Page 5: 2. előadás Szerződések

Szolgáltatás szerződések és szolgáltatás típusok

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

Page 6: 2. előadás Szerződések

Példa szolgáltatás szerződésre (Task Manager)

[ServiceContract()]public interface ITaskManagerService{ [OperationContract()]

int AddTask (String taskDescription, string assignedTo)

//stb…}

Page 7: 2. előadás Szerződések

ServiceContractAttribute I.

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.

Page 8: 2. előadás Szerződések

ServiceContractAttribute II.

Nevesített paraméter

Leírás

Name Az 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.

Namespace A szolgáltatás számára egy cél névteret határoz meg a WSDL-ben. (Default: http://tempuri.org)

CallbackContract Callback szerződésként társít egy újabb szolgáltatás szerződést.

ProtectionLevel Megszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton)

ConfigurationName

A szolgáltatás elem név attribútumát specifikálja a konfigurációs fájlban.

SessionMode Meghatározza, hogy mely session-öket fedhet fel a végpontnál.

Page 9: 2. előadás Szerződések

ServiceContractAttribute III.

[ServiceContract(Name=„TaskManagerService”, Namespace = „http://schemas…”)]

public interface ITaskManagerService{

//stb…}

Page 10: 2. előadás Szerződések

OperationContractAttribute I.

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.

Page 11: 2. előadás Szerződések

OperationContractAttribute II.

Nevesített paraméter

Leírás

Name Az alapértelmezettől eltérő nevet határoz meg.

Action Controls the action header for messages to this operation.

ReplyAction Controls the action header for response messages from this operation.

IsOneWay Jelzi, hogy a művelet egyirányú és nem kap választ.

ProtectionLevel Megszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton).

IsInitiating Jelzi, ha a művelet új session-t kezdeményez a hívó és a szolgáltatás között.

IsTerminating Jelzi, ha a művelet terminál egy létező session-t a hívó és a szolgáltatás között.

Page 12: 2. előadás Szerződések

OperationContractAttribute III.

[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)

}

Page 13: 2. előadás Szerződések

MessageParameterAttribute I.

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.

Page 14: 2. előadás Szerződések

MessageParameterAttribute II.

[OperationContract()][return:

MessageParameter(Name=„responseString”)]

string SomeOp([MessageParameter(Name=„string”] string s)

Page 15: 2. előadás Szerződések

Hiba szerződések

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.

Page 16: 2. előadás Szerződések

FaultException Class

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 <TDetail>: típusos adatot küld a felhasználónak. A TDetail jelenti a hiba információ típusát.

Page 17: 2. előadás Szerződések

FaultContractAttribute

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ó.

Page 18: 2. előadás Szerződések

Példa

[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<sring>(faultDetail);

}return numerator/denominator;

}}

Page 19: 2. előadás Szerződések

Üzenetváltási lehetőségek

Request/response

OneWay

Duplex

Page 20: 2. előadás Szerződések

Request/response I.

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.

Page 21: 2. előadás Szerződések

Request/response II.

[ServiceContract()]public interface ILogisticsService{

[OperationContract()]WorkOrderAcknowledgement SubmitWorkOrder(WorkOrder workOrder);

[OperationContract()]void CancelWorkOrder(int workOderNumber);

}

Page 22: 2. előadás Szerződések

OneWay I.

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.

Page 23: 2. előadás Szerződések

OneWay II.

[ServiceContract()]public interface ILogisticsService{

[OperationContract(IsOneWay=true)]void CancelWorkOder(int workOrderNumber);

}

Page 24: 2. előadás Szerződések

Duplex I.

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.

Page 25: 2. előadás Szerződések

Duplex II.

[ServiceContract()]interface IGreetingHandler{

[OperationContract(IsOneWay=true)]void GreetingProduced(string greeting);

}

[ServiceContract(CallbackContract = typeof(IGreetingHandler))]

interface IGreetingService{

[OperationContract(IsOneWay = true)]void RequestGreetng(string name);

}

Page 26: 2. előadás Szerződések

Duplex III.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

class GreetingService : IGreetService{

public void RequestGreeting(string name){Console.WriteLine(„In Service.Greet”);IGreetingHandler callbackHandler = OperationContext.Current.GerCallbackChannel<IGreetingHandler>();

callbackHandler.GreetingProduced(„Hello ” + name);}

}

Page 27: 2. előadás Szerződések

Szerkezeti szerződések definiálása

Page 28: 2. előadás Szerződések

Adat szerződések I.

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);

Page 29: 2. előadás Szerződések

Adat szerződések II.

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.

Page 30: 2. előadás Szerződések

Adat szerződések III.

[DataContract(Namespace = „http://schemas.fabrikam.com/customers/”)]

public enum TitleOptions : int{

[EnumMember()]Mr = 0,

[EnumMember()]Ms = 1,

[EnumMember()]Mrs = 2,

[EnumMember()]Dr = 3,

}

Page 31: 2. előadás Szerződések

Adat szerződések IV.

[DataContract(Namespace = „http://schemas.fabrikam.com/customers/”)]

public class ContactInfo{

[DataMember(IsRequired = false)]public string PhoneNumber;

[DataMember(IsRequired = false)]public string EmailAddress;

}

Page 32: 2. előadás Szerződések

DataContractAttribute I.

Enum, struktúra, osztály Nem származtatott Összesen két paramétere van.

Page 33: 2. előadás Szerződések

DataContractAttribute II.

Paraméter Leírás

Name Meghatározza a nevet, ami a létrejövő sémában megjelenik.

Namespace Beállítja a sémában a cél névtere. Az alap: http:// schemas.datacontract.org/2004/07[CLR namespace]

Page 34: 2. előadás Szerződések

DataMemberAttribute I.

System.Runtime.Serialization Azt határozza meg, hogy a tagnak benne

kell-e lennie az adatszerkezet szerializációjában.

Page 35: 2. előadás Szerződések

DataMemberAttribute II.

Paraméter Leírás

Name A tagból generált séma elem nevét állítja be. Alapesetben a .NET típusnál ez a mező vagy property neve.

IsRequired minOccurs 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.

Order Az elemek sorrendjét adja meg a sémában.

EmitDefaultValue

Azt adja meg, hogy melyik alapértelmezett értékeket vegye be a szerializációba. Alapértelmezetten true-ra van állítva.

Page 36: 2. előadás Szerződések

EnumMemberAttribute

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.

Page 37: 2. előadás Szerződések

Opt-In vs. Opt-Out I.

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.

Page 38: 2. előadás Szerződések

Opt-In vs. Opt-Out II.

[Serializable()]public class ContactInfo{

public string PhoneNumber;public string EmailAddress;

[NonSerialized()]public string HomeAddress;

}

Page 39: 2. előadás Szerződések

Opt-In vs. Opt-Out III.

[DataContract()]public class ContactInfo{

[DataMember()]public string PhoneNumber;

[DataMember()]public string EmailAddress;

public string HomeAddress;}

Page 40: 2. előadás Szerződések

Kollekciók I.

[ServiceContract()]interface ITaskManager{

[OperationContract()]List<Task> GetTasksByAssignedName (string name);

}

Page 41: 2. előadás Szerződések

Kollekciók II.

[ServiceContract()]Interface ITaskManager{

[OperationContract()]Task[] GetTasksBYAssignedName (string name);

}

Page 42: 2. előadás Szerződések

Kollekciók III.

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

Page 43: 2. előadás Szerződések

Kollekciók IV.

[CollectonDataContract(Name = „MyCollectionOf{0}”)]public class MyCollection<T> : Ienumerable<T>{

public void Add(T item) { … }Ienumerator<T> Ienumerable<T>.GetEnumarator() { … }public Ienumerator GetEnumerator() { … }

//…}

[ServiceContract()]interface ITaskManager{

[OperationContract()]MyCollection<Task> GetTaskByAssignedName(string name);

}

Page 44: 2. előadás Szerződések

Kollekciók V.

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<Task>{}

Page 45: 2. előadás Szerződések

KnownTypeAttribute I.

[DataContract()][KnownType(typeof(LoanApprovalTask))]class Task{ //…}

[DataContract()]class LoanApprovalTask : Task{ //…}

Page 46: 2. előadás Szerződések

KnownTypeAttribute II.

[ServiceContract()]interface ITaskManager{

[OperationContract()]List<Task> GetTasksByAssignedName (string name);

}

Page 47: 2. előadás Szerződések

Üzenet szerződések

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

Page 48: 2. előadás Szerződések

MessageContractAttribute

Paraméter Leírás

IsWrapped Ha „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.

ProtectionLevel Megszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton)

WrapperName Ellátja névvel a test „wrapper” elemet.

WrapperNamespace

Elltája névtérrel a test „wrapper” elemet.

Page 49: 2. előadás Szerződések

MessageHeaderAttribute

Paraméter Leírás

Name A szerializált header elem nevét adja meg.

Namespace Névtérrel látja el a header-t és a gyerekeit, kivéve ha típus szinten felül van írva.

ProtectionLevel Megszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton)

Actor Az URI értéke jelzi, hogy melyik actor a tervezett célja a header-nek.

MustUnderstand Jelzi, hogy a header címzettjének fel kell-e dolgoznia azt.

Relay Jelzi, hogy továbbítania-e kell a következő címzettnek az üzenetet, ha az actor nem dolgozza fel.

Page 50: 2. előadás Szerződések

MessageBodyMemberAttribute

Paraméter Leírás

Name A szerializált test elem nevét felügyeli.

Namespace Névtérrel látja el a test elemet és a gyerekeit, kivéve ha típus szinten felül van írva.

ProtectionLevel

Megszorításokat lehet specifikálni a szolgáltatás szerződéshez. (Milyen szinten vannak védve az üzenetek a hálózaton)

Order Az elemek sorrendjét adja meg a sémában.

Page 51: 2. előadás Szerződések

Üzenet szerződések használatának okai

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.

Page 52: 2. előadás Szerződések

Példa

[DataContract()]public class ContactInfo{

[DataMember()]public string PhoneNumber;

[DataMember()]public string EmailAddress;

}

[ServiceContract()]public interface ISomeService{

[OperationContract()]ContactInfo GetProviderContactInfo();

}

Page 53: 2. előadás Szerződések

Versioning of Data Contracts I.

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

Page 54: 2. előadás Szerződések

Roundtripping I.

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.

Page 55: 2. előadás Szerződések

Roundtripping II.

[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;}

Page 56: 2. előadás Szerződések

Controlling Serialization

Két megoldás: DataContractSerializer XMLSerializer

Page 57: 2. előadás Szerződések

The Format Attributes I.

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

Page 58: 2. előadás Szerződések

The Format Attributes II.

[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);

}

Page 59: 2. előadás Szerződések

The Format Attributes III.

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.

Page 60: 2. előadás Szerződések

DataContractSerializer vs XMLSerializer

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.

Page 61: 2. előadás Szerződések

Building XML Schema-Driven Services

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.

Page 62: 2. előadás Szerződések

Gyakorlat

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