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

Post on 12-Jan-2016

29 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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

TRANSCRIPT

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

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

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)

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

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

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

int AddTask (String taskDescription, string assignedTo)

//stb…}

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.

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.

ServiceContractAttribute III.

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

public interface ITaskManagerService{

//stb…}

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.

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.

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)

}

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.

MessageParameterAttribute II.

[OperationContract()][return:

MessageParameter(Name=„responseString”)]

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

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.

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.

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

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;

}}

Üzenetváltási lehetőségek

Request/response

OneWay

Duplex

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.

Request/response II.

[ServiceContract()]public interface ILogisticsService{

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

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

}

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.

OneWay II.

[ServiceContract()]public interface ILogisticsService{

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

}

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.

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

}

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

}

Szerkezeti szerződések definiálása

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

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.

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,

}

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;

}

DataContractAttribute I.

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

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]

DataMemberAttribute I.

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

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

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.

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.

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.

Opt-In vs. Opt-Out II.

[Serializable()]public class ContactInfo{

public string PhoneNumber;public string EmailAddress;

[NonSerialized()]public string HomeAddress;

}

Opt-In vs. Opt-Out III.

[DataContract()]public class ContactInfo{

[DataMember()]public string PhoneNumber;

[DataMember()]public string EmailAddress;

public string HomeAddress;}

Kollekciók I.

[ServiceContract()]interface ITaskManager{

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

}

Kollekciók II.

[ServiceContract()]Interface ITaskManager{

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

}

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

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

}

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

KnownTypeAttribute I.

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

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

KnownTypeAttribute II.

[ServiceContract()]interface ITaskManager{

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

}

Ü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

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.

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.

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.

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

Példa

[DataContract()]public class ContactInfo{

[DataMember()]public string PhoneNumber;

[DataMember()]public string EmailAddress;

}

[ServiceContract()]public interface ISomeService{

[OperationContract()]ContactInfo GetProviderContactInfo();

}

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

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.

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

Controlling Serialization

Két megoldás: DataContractSerializer XMLSerializer

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

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

}

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.

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.

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.

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

top related