3. előadás szolgáltatások meghirdetése
DESCRIPTION
Készítette: Szabó Zoltán. 3. Előadás Szolgáltatások meghirdetése. Miről lesz szó?. Végpontok ABC-je Beépített kötések Többszörös kötések használata Végpontok létrehozása konfigurációs állomány segítségével Végpontok létrehozása kódból Szolgáltatás meta adatok közzététele - PowerPoint PPT PresentationTRANSCRIPT
3. ElőadásSzolgáltatások meghirdetése
Készítette: Szabó Zoltán
Miről lesz szó?
Végpontok ABC-je Beépített kötések Többszörös kötések használata Végpontok létrehozása konfigurációs
állomány segítségével Végpontok létrehozása kódból Szolgáltatás meta adatok közzététele Beépített kötések módosítása Saját kötések létrehozása
Bevezetés
A szolgáltatások használatához: A kliensnek meg kell találnia a
szolgáltatást Tudnia kell, hogyan kommunikálhat a
szolgáltatással
Ez hogyan érhető el? Megoldás: szolgáltatás végpontok
használata
Szolgáltatás végpontok
Hogyan hozható létre? Konfigurációs állomány segítségével Kódolással
Mit tartalmaz? Végpontok ABC-jét▪ Address▪ Binding▪ Contract
Viselkedés leírókat
Végpontok ABC-je
Address Hol található a szolgáltatás?
Binding Hogyan kommunikálhatunk a
szolgáltatással?Conctract
Mit csinál a szolgáltatás?
Ezek a végpontok fő alkotóelemei
Address
A szolgáltatás egyedi címe (URL) WS-Addressing szabvány alapján
Scheme▪ A cím legfelső szintű része▪ Nem azonos a protokollal
Számítógép▪ Lehet publikus URL vagy lokális azonosító
(localhost) Port Útvonal▪ Elérési út a szolgáltatás fájljaihoz
Address
A cím változó lehet, függ Hosztolás (lokális vagy publikus) Kötés által használt protokoll
Néhány példa: http://www.contoso.com/OrderService/ http://localhost:8000/Services/
OrderService/ net.tcp://localhost:8001/OrderService/
Binding
Meghatározza a szolgáltatás elérésének módját Protokoll Üzenetek kódolása Biztonsági követelmények (pl.: SSL)
Számos előre elkészített kötést tartalmaz a WCF
Hogyan válasszuk ki a megfelelő kötést? Függ a feladattól A használat környezetétől Az üzenetek kódolásának típusától
Melyik kötést válasszuk?
Melyik kötést válasszuk?
Számítógépen belüli kommunikáció netNamedPipeBinding
Gépek közötti kommunikáció netTcpBinding netPeerTcpBinding
Nem WCF gépekkel való együttműködés esetén basicHttpBinding wsHttpBinding
Üzenetsorok esetén netMsmqBindig vagy msmqIntergationBinding
Kötések teljesítménye
Binding Number of calls processed in 10 seconds
WSDualHttpBinding 1602 (5773)
WSHttpBinding 2531 (17257)
BasicHttpBinding: 17913
NetTcpBinding 39957
NetNamedPipeBinding 48255 A WSDualHttpBinding és a WSHttpBinding
azonban a security kikapcsolásával gyorsíthatóak. Ezen értékek láthatóak a zárójelben.
Beépített kötések
Kötés Leírás
basicHttpBinding
Ez az interoperábilis kötés gyakran használatos korábbi ASMX-en (Active Server Methods) alapuló szolgáltatások felváltójaként. Támogatja a HTTP és HTTPS protokollokat, valamint a sima szöveges és MTOM (Message Optimization Mechanism) kódolási eljárást is.
wsHttpBindingws2007HttpBinding
Egy biztonságos és interoperábilis kötés, mely SOAP-ot használ HTTP felett. Támogatja a HTTP és HTTPS protokollokat, illetve a szöveges és MTOM kódolást is. Emellett biztonságot, megbízhatóságot és tranzakció kezelést is nyújt.
wsDualHttpBinding
Biztonságos és interoperábilis kötés, mely általában duplex szolgáltatás szerződések esetén használatos, mivel támogatja a kétirányú kommunikációt.
webHttpBinding Olyan szolgáltatás végpontok létrehozásához előnyös, melyek direkt HTTP és HTTPS információkat küldenek SOAP üzenetek helyett. Biztonságos és interoperábilis.
Beépített kötések
Kötés Leírás
wsFederationHttpBindingws2007FederationHttpBinding
Biztonságos, interoperábilis kötés, mely támogatja a WS-Federation protokollt, megadva ezzel a szövetségi szervezeteknek a felhasználók megfelelő hitelesítését. Szintén támogatja a HTTP és HTTPS transzport protokollokat, valamint a szöveges és MTOM kódolást.
netTcpBinding Biztonságos kötés, mely WCF alkalmazásokat futtató gépek közötti kommunikációra lett optimalizálva. A TCP protokollt használja, ezen felül biztonságot, megbízhatóságot és tranzakciókezelést nyújt.
netNamedPipeBinding
Biztonságos, megbízható, optimalizált megoldást biztosít az azonos gépen futó WCF alkalmazások kommunikációjára.
netMsmqBinding
Egy várakozó sorral rendelkező kötés, mely alkalmas gépek közötti kommunikációra WCF alkalmazások között.
Beépített kötések
Kötés Leírás
netPeerTcpBinding Biztonságos kötés több gép között P2P protokoll használatával TCP felett.
msmqIntergationBinding
Interoperábilis kötés, melyet meglévő MSMQ alkalmazásokkal való kommunikációhoz használhatunk gépek között.
basicHttpContextBinding
Ez a kötés támogatást nyújt a HTTP sütikhez, valamint engedélyezi a SOAP fejléceket a kontextus cseréhez.
netTcpContextBinding
Ez a biztonságos kötés engedélyezi a SOAP fejlécek használatát a tartalom cseréjekor.
wsHttpContextBinding
Biztonságos és interoperábilis kötés, mely engedélyezi a SOAP fejléceket a kontextus váltáshoz, emellett támogatja a tranzakciókat, a megbízhatósághoz és biztonsághoz kapcsolódó elemeket.
Kötések összefoglalása
Contract
A végpontok utolsó fő alkotóeleme Meghatározza a szolgáltatás által
nyújtott Műveleteket Az üzenetek felépítését A műveletek meghívásához szükséges
adatokat Milyen feldolgozást vagy válasz üzenetet
kaphat a kliens Általában egy interface-ben foglal helyet
Végpont létrehozása
Konfigurációs állomány (deklaratív) web.config IIS hosztolás esetén app.config WAS esetén Könnyű változtathatóság Nincs szükség újrafordításra
Kód (imperatív) Nem ajánlott
Konfigurációs állomány
Egy XML fájl A fájl gyökéreleme a <configuration> elem A szolgáltatások információinak a
system.serviceModel elem alatt kell elhelyezkedniük
A services szekció alatt lehet egy vagy több service elem
A service elemben kell végpontot definiálni A service elem esetén a name attribútum kötelező Legalább egy végpont definíciót tartalmaznia kell
minden service elemnek Egy állomány leírhat több szolgáltatást és
végpontot
Konfigurációs állomány
Elem Leírás
<behaviors> Szolgáltatások (<serviceBehaviors>), végpontok (endpointBehaviors) viselkedésének leírásához. Minden <behavior> elemnek rendelkeznie kell egy name attribútummal, mely egyedi kell legyen.
<bindings> Testreszabott kötések megadásához. Minden elemnek egyedi azonosító name attribútuma van, mellyel a szolgáltatások hivatkoznak a kötésekre.
<client> Végpontok (<endpoint>) listája, melyek segítségével a kliens kapcsolódhat egy szolgáltatáshoz.
<comContracts> COM szerződések leírására, melyek lehetővé teszik a COM és WCF közötti együttműködést.
<commonBehaviors>
Csak a machine.config fájlban adható meg. Olyan viselkedéseket ír le, mely a gépen lévő összes szolgáltatásra és végpontra érvényes.
Konfigurációs állomány
Elem Leírás
<diagnostics> A WCF diagnosztikai lehetőségeinek beállításait tartalmazó rész. Ilyen például a nyomonkövetés (tracing), a teljesítmény számlálók, de akár testreszabott üzenetszűrőket is tartalmazhat.
<extensions> Kiegészítések a felhasználó által készített kötések és viselkedések létrehozásához.
<protocolMapping>
Kötések és transport protokollok megfeleltetését írja le.
<routing> Számos útvonalszűrő adható meg ebben a részben. (pl.: megadott típusú üzeneteket mindig ugyanaz a végpont kapja meg.)
<servicesHostingEnvironment>
Csak app.config vagy machine.config tartalmazhatja. A szolgáltatás hoszt környezetének leírásához.
Konfigurációs állomány
Elem Leírás
<services> Szolgáltatásokat összefogó elem. Benne találhatók a szolgáltatás leírók (<service>). Minden egyes <service> elem az adott szolgáltatáshoz tartozó beállításokat tartalmazza.
<standardEndpoints>
Ez a konfigurációs szekció teszi lehetővé a standard, előre felkonfigurált végpontok létrehozását. Ezek a végpontok újrahasznosíthatóak. Ezek a végpontok egy vagy több előre fixált címeket, kötéseket és szerződéseket tartalmaznak.
Konfigurációs állomány
A konfigurációs állomány szerkesztéséhez rendelkezésre bocsát egy programot a Visual Studio: WCF Service Configuration Editor Ennek használatáról lesz szó a gyakorlati
részben Illetve a következő oldal videóiban:▪ http://msdn.microsoft.com/en-us/netframewor
k/dd939784
Példa
<configuration> <system.serviceModel> <services> <service name=”MyNamespace.OrderService”>
<endpoint address=”http://localhost:8000/OrderService/” binding=”wsHttpBinding” contract=”MyNamespace.IOrderService”>
</endpoint> </service> </services> </system.serviceModel></configuration>
Többszörös kötések használata
Hasznos lehet egy szolgáltatást felkészíteni többféle elérési lehetőségre TCP HTTP
Több végpont esetén a kliens a számára legmegfelelőbbet választhatja ki
Többszörös kötések használata<configuration> <system.serviceModel> <services> <service name=”OrderService”>
<endpoint address=”http://localhost:8000/OrderService/” binding=”basicHttpBinding” contract=”MyNamespace.IOrderService”>
</endpoint><endpoint address=”http://localhost:8000/OrderService/secure”
binding=”wsHttpBinding” contract=”MyNamespace.IOrderService”>
</endpoint><endpoint address=”net.tcp://localhost:8001/OrderService/”
binding=”netTcpBinding” contract=”MyNamespace.IOrderService”>
</endpoint> </service> </services> </system.serviceModel></configuration>
Többszörös kötések használata
Fontos megjegyezni, hogy a végpontok címének egyedinek kell lennie Ellenkező esetben hibát kapunk Kivétel, ha egy szolgáltatás 2 különböző
szerződést használ▪ Cím, kötés egyezhet▪ Viszont ekkor a szerződésnek kell
különbözőnek lennie
Szolgáltatás címének megadása
Abszolút address=”http://www.contoso.com/
FirstService” Könnyen érthető Egyszerűen megadható Nem túl hatékony több végpont esetén▪ Sokat kell gépelni, emiatt könnyebb elírni▪ Változtatás esetén több helyen is módosítani
kell
Szolgáltatás címének megadása
Relatív Több végpont megadása esetén
hatékonyabb Szükséges a báziscím megadás▪ <host> elemen belül▪ <add> elem segítségével▪ Több báziscím is megadható
Példa
<host> <baseAddresses> <add baseAddress=”http://localhost:8000/OrderSercive/”/> <add baseAddress=”net.tcp://localhost:8000/OrderSercive/”/> </baseAddresses></host><endpoint address=””
binding=”basicHttpBinding”contract=”MyNamespace.IOrderService”>
</endpoint><endpoint address=”secure”
binding=”wsHttpBinding”contract=”MyNamespace.IOrderService”>
</endpoint><endpoint address=”” binding=”netTcpBinding”
contract=”MyNamespace.IOrderService”></endpoint>
Végpont létrehozása kódból
Kódból is megadható minden, amit eddig a konfigurációs állományban megadtunk
Ehhez létre kell hoznunk egy ServiceHost objektumot AddServiceEndpoint metódusával
adhatunk meg végpontokat▪ Address▪ Binding▪ Contract
Példa
Uri httpAddress = new Uri(”http://localhost:8000/OrderService/”);Uri tcpAddress = new Uri(”net.tcp://localhost:8001/OrderService/”);Uri[] baseAddresses = {httpAddress, tcpAddress};
ServiceHost host = new ServiceHost(typeof(MyNameSpace.OrderService),baseAddresses);host.AddServiceEndpoint(
typeof(MyNamespace.IOrderService),new BasicHttpBinding(),””);
host.AddServiceEndpoint(typeof(MyNamespace.IOrderService),new WSHttpBinding(),”secure”);
host.AddServiceEndpoint(typeof(MyNamespace.IOrderService),new NetTcpBinding(),””);
Meta adatok közzététele
A WCF lehetőséget biztosít a meta adatok közzétételére a végpontokon keresztül HTTP-GET használatával HttpGetEnabled=true megadásával
Ehhez meg kell adni egy szolgáltatás viselkedést
Majd a szolgáltatás megadásakor hivatkozni kell a viselkedésre(kód vagy konfig)
Ehhez szükség van egy speciális végpontra
Meta adatok közzététele
Ezen végpont címe a szolgáltatás címének kiegészítése a mex szóval
A végpontnak a mexHttpBinding kötést kell használnia (esetleg mexNamedPipeBinding vagy mexTcpBinding)
A végpont szerződése az IMetadataExchange interface kell legyen
A megadás történhet konfig fájlban és kódban
Példa
<services><service name=”OrderService” behaviorConfiguration=”MexGet”>
<endpoint address=”http://localhost:8000/OrderService/”binding=”basicHttpBinding”contract=”MyNamespace.IOrderService” />
<endpoint address=”mex”binding=”mexHttpBinding”contract=”IMetadataExchange” />
</service></services><behaviors>
<serviceBehaviors><behavior name=”MexGet”>
<serviceMetadata httpGetEnabled=”True” /></behavior>
</serviceBehaviors></behaviors>
Példa
ServiceHost host = new ServiceHost(typeof(OrderService));
ServiceMetadataBehavior mb;mb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();if(mb == null){
mb = new ServiceMetadataBehavior();mb.HttpGetEnabled = true;host.Description.Behaviors.Add(mb);
}Host.AddServiceEndpoint(
typeof(MyNamespace.IOrderService),new BasicHttpBinding(),”http://localhost:8000/OrderService/”);
Host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(),”mex”);
Beépített kötések testre szabása
Legtöbb esetben a beépített kötések használata megfelelő
Előfordulhatnak olyan speciális körülmények, amikor szükséges meglévő kötések módosítása új kötéstípus létrehozása
A WCF mindkét lehetőséget támogatja
Beépített kötések testre szabása
A legtöbb beépített kötés rendelkezik módosítható tulajdonságokkal, melyekkel igényeiknek megfelelően testre szabhatjuk őket
wsHttpBinding property-kProperty Leírás Alapérték
AllowCookies Egy logikai érték, mely meghatározza, hogy a kliens használhat-e sütiket
False
ByPassProxyOnLocal
Logikai érték, mely meghatározza, hogy a lokális címek kikerüljék-e a proxyt.
False
CloseTimeout Azt az időt jelzi, mely eltelhet a kapcsolatbontásnál mielőtt az hibát eredményezne.
1 perc
HostNameComparisonMode
Meghatározza, hogy a hosztnév szükséges-e a szolgáltatás eléréséhez, amennyiben egyezik az URI.
StrongWildCard
MaxBufferPoolSize Meghatározza a puffer menedzserhez rendelhető maximális memóriamennyiséget.
65536 byte
wsHttpBinding property-k
Property Leírás Alapérték
MaxRecievedMessageSize
Az üzenet maximális hosszát határozza meg.
65536 byte
MessageEncoding Megadja az üzenetek kódolásához használt eljárást. (szöveg/XML vagy MTOM)
Szöveg
Name A kötés neve. Null referencia
Namespace A kötéshez rendelt XML névtér. http://tempuri.org/
OpenTimeout Megadja, hogy mennyi idő telhet el kapcsolat nyitásakor a hiba keletkezéséig.
1 perc
ProxyAddress Egy proxy URI címét határozza meg. Amennyiben a UseDefaultWebProxy értéke igazra van állítva, ez a mező figyelmen kívül lesz hagyva.
Null referencia
wsHttpBinding property-kProperty Leírás Alapérték
ReaderQuotas Szöveges tartalmakra alkalmazott megkötések. Pl.: maximális hossz.
None
RecieveTimeout Megadja, hogy egy kapcsolat meddig lehet inaktív, mielőtt kivétel keletkezne.
10 perc
SendTimeout Megadja, hogy legfeljebb mennyi ideig tarthat egy írási művelet, mielőtt kivétel keletkezne.
1 perc
TextEncoding Az üzenet szövegének kódolásához használt eljárás.
UTF8Encoding
TransactionFlow Megadja, hogy a kötés támogatja-e a WS-Transactions szabvány.
False
UseDefaultWebProxy
Megadja, hogy a kötés használja-e az automatikusan konfigurált proxyt vagy sem.
True
Beépített kötések testre szabása
Kódban Binding osztály használatával
Konfigurációs állományban bindingConfiguration property
használatával▪ A módosított kötés nevére hivatkozik
A bindings szekcióban ekkor szerepelnie kell a módosított kötésnek
Példa
<system.serviceModel> <services> <service name=”OrderService”> <endpoint address=”http://localhost:8000/OrderService/”
contract=”MyNamespace.IOrderService”binding=”wsHttpBinding”bindingConfiguration=”CloseTimeout” />
</service> </services> <bindings> <wsHttpBinding> <binding name=”CloseTimeout” closeTimeout=”00:03:00” /> </wsHttpBinding> </bindings></system.serviceModel>
Példa
ServiceHost host = new ServiceHost(typeof(OrderService));
WSHttpBinding wsBinding = new WSHttpBinding();TimeSpan ts = new TimeSpan(0, 3, 0);wsBinding.CloseTimeout = ts;
host.AddServiceEndpoint(typeof(MyNameSpace.IOrderService),wsBinding,”http://localhost:8000/OrderService/”);
Egyedi kötések
Vannak olyan ritka esetek, amikor a meglévő kötések még módosításokkal sem tudják kielégíteni az elvárásainkat
A WCF ezért lehetőséget nyújt CustomBinding vagy ún. saját kötés típus létrehozására A javaslat az, hogy amennyiben
lehetséges inkább módosítsunk egy meglévő kötést
Egyedi kötések
A kötés típusok egy vagy több kötési elemből épülnek fel
A kötési elemek megadják a Protokollt Kódolást - kötelező Átviteli eljárást – kötelező
A kötés létrehozásakor fontos az elemek megadásának sorrendje
Elemek megadásának sorrendjeElem Leírás
Transaction flow
Tranzakciók kezelésének megadásához. Opcionális.
Reliability Megadja, hogy a csatornák megbízható session-t használjanak-e. Lehetővé teszi az üzenetek sorrendhelyes átvitelét. Opcionális.• netTcpBinding• wsHttpBinding• wsDualHttpBinding
Security Opcionális. Lehetőséget nyújt olyan funkciók megadására, mint autentikáció, authorizáció, védelem és titoktartás.
Transport Kötelezően megadandó elem. Saját transzport megadása vagy a következők egyike: TCP, NamedPipes, HTTP, HTTPS, MSMQ vagy P2P.
Encoding Ez a kötelező elem adja meg az üzenetek kódolását. Ez lehet szöveg, bináris vagy MTOM kódolás.
CustomBinding létrehozása
Konfigurációs állományban A bindings szekció alatt A customBinding elem használatával
Kódban System.ServiceModel.Channels névtér
megadásával BindingElementCollection és
CustomBinding létrehozásával
Példa
<system.serviceModel> <services> <service name=”OrderService”> <endpoint address=”http://localhost:8000/OrderService/”
contract=”MyNamespace.IOrderService”binding=”customBinding”bindingConfiguration=”NewBinding” />
</service> </services> <bindings> <customBinding> <binding name=”NewBinding”>
<reliableSession /><security>
<localServiceSettings inactivityTimeout=”00:10:00” /></security><httpTransport /><textMessageEncoding />
</binding> </customBinding> </bindings></system.serviceModel>
Példa
using System.ServiceModel.Channels;
ServiceHost host = new ServiceHost(typeof(OrderService));
BindingElementCollection bec = new BindingElementCollection();SymmetricSecurityBindingElement ssbe = new SymmetricSecurityBindingElement();ssbe.LocalServiceSettings.InactivityTimeout = new TimeSpan(0, 10, 0);bec.Add(ssbe);bec.Add(newTextMessageEncodingBindigElement());bec.Add(new HttpTransportBindingElement());CustomBinding customBinding = new CustomBinding(bec);
host.AddServiceEndpoint(typeof(MyNameSpace.IOrderService),customBinding,”http://localhost:8000/OrderService/”);
Gyakorlatként megoldott feladat
http://bloggingabout.net/blogs/dennis/archive/2010/06/16/wcf-simple-example-in-visual-studio-2010.aspx