2. előadás szerződések
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 PresentationTRANSCRIPT
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