500 likes | 607 Views
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
E N D
Készítette: Szabó Zoltán 3. ElőadásSzolgá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 • 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álisvagy 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? • 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 • A WSDualHttpBinding és a WSHttpBinding azonban a securitykikapcsolásával gyorsíthatóak. Ezen értékek láthatóak a zárójelben.
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.configWAS 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 • 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/netframework/dd939784
Példa <configuration> <system.serviceModel> <services> <service name=”MyNamespace.OrderService”> <endpointaddress=”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”> <endpointaddress=”http://localhost:8000/OrderService/” binding=”basicHttpBinding” contract=”MyNamespace.IOrderService”> </endpoint> <endpointaddress=”http://localhost:8000/OrderService/secure” binding=”wsHttpBinding” contract=”MyNamespace.IOrderService”> </endpoint> <endpointaddress=”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> <endpointaddress=”” binding=”basicHttpBinding” contract=”MyNamespace.IOrderService”> </endpoint> <endpointaddress=”secure” binding=”wsHttpBinding” contract=”MyNamespace.IOrderService”> </endpoint> <endpointaddress=”” 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 • AddServiceEndpointmetódusával adhatunk meg végpontokat • Address • Binding • Contract
Példa Uri httpAddress = newUri(”http://localhost:8000/OrderService/”); Uri tcpAddress= newUri(”net.tcp://localhost:8001/OrderService/”); Uri[] baseAddresses = {httpAddress, tcpAddress}; ServiceHosthost = newServiceHost(typeof(MyNameSpace.OrderService),baseAddresses); host.AddServiceEndpoint( typeof(MyNamespace.IOrderService), newBasicHttpBinding(), ””); host.AddServiceEndpoint( typeof(MyNamespace.IOrderService), newWSHttpBinding(), ”secure”); host.AddServiceEndpoint( typeof(MyNamespace.IOrderService), newNetTcpBinding(), ””);
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 IMetadataExchangeinterface kell legyen • A megadás történhet konfig fájlban és kódban
Példa <services> <service name=”OrderService” behaviorConfiguration=”MexGet”> <endpointaddress=”http://localhost:8000/OrderService/” binding=”basicHttpBinding” contract=”MyNamespace.IOrderService” /> <endpointaddress=”mex” binding=”mexHttpBinding” contract=”IMetadataExchange” /> </service> </services> <behaviors> <serviceBehaviors> <behaviorname=”MexGet”> <serviceMetadatahttpGetEnabled=”True” /> </behavior> </serviceBehaviors> </behaviors>
Példa ServiceHosthost = newServiceHost(typeof(OrderService)); ServiceMetadataBehaviormb; mb = host.Description.Behaviors.Find<ServiceMetadataBehavior>(); if(mb == null){ mb = newServiceMetadataBehavior(); mb.HttpGetEnabled = true; host.Description.Behaviors.Add(mb); } Host.AddServiceEndpoint( typeof(MyNamespace.IOrderService), newBasicHttpBinding(), ”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
Beépített kötések testre szabása • Kódban • Binding osztály használatával • Konfigurációs állományban • bindingConfigurationproperty 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”> <endpointaddress=”http://localhost:8000/OrderService/” contract=”MyNamespace.IOrderService” binding=”wsHttpBinding” bindingConfiguration=”CloseTimeout” /> </service> </services> <bindings> <wsHttpBinding> <bindingname=”CloseTimeout” closeTimeout=”00:03:00” /> </wsHttpBinding> </bindings> </system.serviceModel>
Példa ServiceHosthost = newServiceHost(typeof(OrderService)); WSHttpBindingwsBinding = newWSHttpBinding(); TimeSpants = newTimeSpan(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
CustomBinding létrehozása • Konfigurációs állományban • A bindings szekció alatt • A customBinding elem használatával • Kódban • System.ServiceModel.Channelsnévtér megadásával • BindingElementCollection és CustomBinding létrehozásával
Példa <system.serviceModel> <services> <service name=”OrderService”> <endpointaddress=”http://localhost:8000/OrderService/” contract=”MyNamespace.IOrderService” binding=”customBinding” bindingConfiguration=”NewBinding” /> </service> </services> <bindings> <customBinding> <bindingname=”NewBinding”> <reliableSession /> <security> <localServiceSettingsinactivityTimeout=”00:10:00” /> </security> <httpTransport /> <textMessageEncoding /> </binding> </customBinding> </bindings> </system.serviceModel>
Példa usingSystem.ServiceModel.Channels; ServiceHosthost = newServiceHost(typeof(OrderService)); BindingElementCollectionbec = newBindingElementCollection(); SymmetricSecurityBindingElementssbe = newSymmetricSecurityBindingElement(); ssbe.LocalServiceSettings.InactivityTimeout = newTimeSpan(0, 10, 0); bec.Add(ssbe); bec.Add(newTextMessageEncodingBindigElement()); bec.Add(newHttpTransportBindingElement()); CustomBindingcustomBinding = newCustomBinding(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