windows communication foundation

46
WINDOWS COMMUNICATION FOUNDATION Session és példányosítás

Upload: isabella-mitchell

Post on 02-Jan-2016

34 views

Category:

Documents


1 download

DESCRIPTION

Windows communication foundation. Session és példányosítás. Példányosítási módok. példányosítás. A WCF felelős egy bejövő üzenet egy adott szolgáltatás példányhoz kötéséért. Amikor egy kérés érkezik, a WCF eldönti, hogy egy létező szolgáltatás példány fel tudja-e dolgozni a kérést. - PowerPoint PPT Presentation

TRANSCRIPT

Windows communication foundation

Windows communication foundationSession s pldnyostsPldnyostsi mdok22pldnyostsA WCF felels egy bejv zenet egy adott szolgltats pldnyhoz ktsrt.Amikor egy krs rkezik, a WCF eldnti, hogy egy ltez szolgltats pldny fel tudja-e dolgozni a krst.Ennek eldntsre egy dntsi mtrixot llt fel.3PldnykezelsMinden szolgltatsnak van egy pldnykezelsi modellje. Hrom ilyen modell ltezik: az egyke (single), amelyben egyetlen CLR objektum szolglja ki az sszes klienst; a hvsonknti (per call), melyben minden egyes klienshvs kiszolglsra j CLR-objektum jn ltre; s a munkamenetenknti (per session), melynl minden egyes munkamenethez egy kiszolgl CLR objektum jn ltre. A pldnykezelsi modell kivlasztsa fgg az alkalmazs ltal tmasztott kvetelmnyektl s a szolgltats tervezett hasznlattl.

44Pldnykezels 2.A pldnyosts mdjnak meghatrozsa a szolgltats oldalon trtnik, azon bell is a szolgltats viselkedsnek (Service Behavior) lerjban.Ez azt jelenti, hogy a szolgltats sszes vgpontjban ugyanez a pldnyostsi md lesz rvnyes.5Hvsonknti (per call) md

6Hvsonknti (per call) md Hvsonknt mdban minden egyes krsnek sajt szolgltats pldnya van.A kliens egy proxyn keresztl intz krseket a szolgltats fel.Amikor a krs megrkezik a szolgltats hoszthoz, a hoszt a szolgltatst implementl osztlybl ltrehoz egy j pldnyt.Miutn a krs befejezdtt s a vlasz is visszakldsre kerlt a kliens fel, a pldnyra mr nincs szksg.Minden szolgltats ler osztlynak implementlni kell az IDisposable interfszt. Amikor az adott pldny elvgezte a dolgt, meghvdik a Dispose metdus.

7Hvsonknti (per call) md A WCF-ben a hvsonknti md az alaprtelmezett.Ennek egyik oka, hogy gy a fejlesztnek nem kell foglalkoznia a konkurens feldolgozssal.Viszont szmos htrnya is van ennek a mdnak:Teljestmny szempontjbl nem elnysHa egy szolgltats pldny zrol egy erforrst a teljes letciklusa idejre, akkor az az erforrs a tbbi pldny szmra elrhetetlenn vlik. (pl. fjl, adatbzis, stb.)A problmk kikszblsre lteznek megoldsok.

8Hvsonknti (per call) md Az egyik megolds egy proxy objektum rendelse a szolgltatshoz.Az alaprtelmezett programozsi modell szerint, ha egy adott szolgltats pldnyra nincs szksg, akkor arra meghvdik a Dispose metdus. Ez rvnytelenti a referencit, ami nem mindig kvnatos.A WCF-ben a kliens a proxyra tart fent egy referencit, ami nem sznik meg minden hvs utn.A proxy feladata az, hogy a szolgltats pldnyt jra ltrehozza, ha szksges.

9Hvsonknti (per call) md A pldnyostsi md megadsi a szolgltats oldaln trtnik:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] class UpdateService : IUpdateService {...}

Habr elmletben a kliensnek nem kell tudnia a pldnyosts mdjrl, a hvsonknti pldnyostsi md azt jelenti, hogy a hvsok kztt nem rzdik meg az llapot.Ha brmilyen okbl mgis szksg van az llapot megrzsre, a szolgltats feladat biztostani azt. (pl. adatbzisba ments)10Munkamenetenknti (per session) md

11Munkamenetenknti (per session) mdAz elbbiekben mr felmerlt az igny a hvsok kztt az llapotok megrzsre, gy ltezik egy munkamenetenknti (per session) pldnyostsi md is.A WCF kpes egy privt session-t ltesteni a kliens s a szolgltats pldny kztt.Minden klienshez az els krsekor hozzrendeldik egy szolgltats pldny s elkezddik egy munkamenet.Minden tovbbi krs ennek a munkamenetnek a rsze lesz, s ugyanaz a szolgltats pldny fogja vgrehajtani azt.12Munkamenetenknti (per session) mdA munkamenetenknti md belltshoz 2 dolog szksges:A szerzds rgzti, hogy szksges a munkamenet. Ez azrt fontos, mert a kliensnek tartalmazni kell egy azonostt, hogy megtallja az adott szolgltats objektumot.A munkamenetenknti md belltsa a szolgltats oldalon:[ServiceContract(SessionMode = SessionMode.Required)] public interface IUpdateService { // Interface definition code goes here }13Munkamenetenknti (per session) mdA msik dolog:A WCF-nek is meg kell mondani, hogy munkamenetenknti mdot szeretnnk hasznlni, s a szolgltats pldnyt tartsa meg az egsz munkamenet alatt.Ennek megadsa a kvetkezkppen trtnik:[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class UpdateService : IUpdateService { // Implementation code goes here }14Munkamenetenknti (per session) mdA kapcsolat igazbl nem a kliens s a szolgltats kztt ll fenn, hanem egy adott proxy pldny kztt, amit a kliens s a szolgltats hasznl.Amikor a WCF-ben ltrehozunk egy proxyt, annak lesz egy azonostja, amit a szolgltats hoszt arra hasznl, hogy a krseket a megfelel pldnyokhoz tovbbtsa.Mivel ez az azonost a proxy pldnyhoz rendelt, gy ha a kliens egy proxybl tbb pldnyt is ltrehoz, azok nem alkotnak egy munkamenetet. Minden proxynak sajt szolgltats pldnya lesz.15Munkamenetenknti (per session) mdAhogy mr korbban emltettk, a szolgltats pldny addig ltezik, amg a kliensnek szksge van r.Egy munkamenet megsznsnek legtermszetesebb mdja, amikor a kliens bezrja a proxyt.Ekkor egy zenet kerl elkldse a szolgltats fel, hogy a munkamenet lezrult.De mi van akkor, ha valamilyen okbl a kliens nem zrja be a proxyt?Ebben az esetben a munkamenet 10 percnyi inaktivits utn automatikusan megsznik. Ezutn ha a kliens jra hasznlni szeretn a proxyt, CommunicationObjectFaultedException t kap.16Munkamenetenknti (per session) mdEz a 10 perc csak egy alaprtelmezett rtk, a ktstl fggen vltozhat. Ha a kts egy megbzhat munkamenetet (reliable session) biztost, akkor az InactivityTimeout tulajdonsgot ennek megfelelen tllthatjuk.Erre egy plda:NetTcpBinding binding = new NetTcpBinding(); binding.ReliableSession.Enabled = true; binding.ReliableSession.InactivityTimeout = TimeSpan.FromMinutes(60);17Munkamenetenknti (per session) mdUgyanezt a config fjlban is megtehetjk:

35kvtkKdbl:NetTcpBinding binding = new NetTcpBinding(); binding.MaxReceivedMessageSize = 128000; ServiceHost host = new ServiceHost( typeof(UpdateService), new Uri("net.tcp://localhost:1234/UpdateService"));host.AddServiceEndpoint( "IUpdateService",binding, String.Empty); host.Open();36kvtkReaderQuotas: a kts ezen tulajdonsga a berkez zenetek komplexitsnak mrtkt hatrozza meg.Bellthat tulajdonsgok:

37PropertyAlaprtkLersMaxDepth32Megadja, hogy az zenet node-jai milyen mlysgig mehetnek le.MaxStringContentLength8192Az zenetben lv leghosszabb string max rtke.MaxArrayLength16384Maximum hny rtk lehet egy tmbben.MaxBytesPerRead4096Max hny byte rtkkel trhet vissza a Read.MaxNameTableCharCount16384Tblanv max hossza.Mveletek elhatrolsaAlaprtelmezetten egy session csak azt jelenti, hogy a szolgltats meg tudja llaptani, hogy melyik klienstl rkezett a krs.Azonban vannak esetek, amikor a mveletek vgrehajtsi sorrendje is szmt. A WCF biztost erre egy mechanizmust a szerzds tervezjnek, mellyel megadhatja, hogy mely metdusok nem lehetnek elsk, vagy utolsk. Erre az IsInitiating s az IsTerminating propertyk szolglnak, melyeket a OperationContract attribtumon bell llthatunk.Ha egy metdus IsInitiating attribtum rtke true, s mg nem jtt ltre session, a metdus hvsakor, akkor egybl ltrejn egy. Ha mr ltezik session, akkor a metdus azon bell hvdik meg.38Mveletek elhatrolsaHa a metdus IsTerminating attribtum rtke true, amikor a metdus befejezi futst, a session lezrul. Ez mg nem jelenti azt, hogy megsznik a szolgltats pldny, a kliensnek ettl fggetlenl mg meg kell hvniuk a proxy Close metdust. Habr minden tovbbi utasts efel a proxy fel InvalidOperationException-nel tr vissza.Ezekkel a propertykkel bellthat a mveletek kezd s vgpontja.Az IsInitiating alaprtke true, az IsTerminating alaprtke false.39Mveletek elhatrolsaBelltsa:[ServiceContract(SessionMode = SessionMode.Required)] public interface IProcessOrders { [OperationContract] void InitializeOrder(int customerId);[OperationContract(IsInitiating=false)] void AddOrderLine(string productId, int quantity); [OperationContract(IsInitiating=false)] double GetOrderTotal(); [OperationContract(IsInitiating=false, IsTerminating=true)] bool SubmitOrder(); }40Pldny deaktivlsa

41Pldny deaktivlsaAhogy az elz brn is lthat, egy pldny egy Context objektumon bell tltdik be, s a session informcik a kliens zeneteit nem kzvetlenl a pldnyhoz ktik, hanem a Context objektumhoz.Amikor egy session ltrejn, akkor a szolgltats hoszt egy j kontextust kszt. Ez a kontextus megsznik, ha a session megsznik.Ez azt jelenti, hogy alaprtelmezetten az kontextus addig l, ameddig a benne lv pldny.A WCF lehetsget nyjt arra, hogy a kt letciklust klnvlasszuk.42Pldny deaktivlsaLtrehozhat olyan kontextus is, amiben nincs egyetlen pldny sem.A kontextus deaktivci menedzselse az OperationBehavior ReleaseInstanceMode propertyjn keresztl trtnik.A ReleaseInstanceMode-ban szmos rtk bellthat:BeforeCallAfterCallBeforeAndAfterCallNoneAz alaprtelmezett rtk a None. Ez azt jelenti, hogy a szolgltats pldny azutn is ltezik, miutn feldolgozta a krst.

43Pldny deaktivlsaBeforeCall md esetn minden krs eltt j pldny jn ltre. Ha egy pldny mr eleve ltezik, akkor deaktivldik s meghvdik r a Dispose metdus. Ezalatt a kliens blokkoldik. Az a md ltalban akkor hasznlatos, ha a metdus egy kritikus erforrshoz szeretne hozzfrni s biztosnak kell lenni abban, hogy az sszes elz hozzfrs trldtt.AfterCall md esetn a metdus lefutsa utn az aktulis pldny deaktivldik s meghvdik r a Dispose metdus. Ezzel azt biztosthatjuk, hogy a metdus ltal hasznlt erforrst azonnal felszabadtjuk, amint nincs mr r szksg, gy a kvetkez hvsnl egybl elrhet lesz.44Pldny deaktivlsaBeforeAndAfterCall md esetn a md az elbbi kett tvzse. Gyakorlatilag ugyanaz, mint a hvsonknti (per call) pldnyostsi md. A klnbsg csak annyi, hogy ezt a mdot metdusonknt tudjuk belltani, gy minden egyes metdusra ms s ms lehet a pldnyostsi md.Belltsa:public class UpdateService : IUpdateService { [OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.BeforeAndAfterCall)] public void Update() { // Implementation code goes here }}45Pldny deaktivlsaLehetsg van az aktulis szolgltats pldny futsidej deaktivlsra is.Ehhez az kontextus biztost egy ReleaseServiceInstance metdust. Amikor ezt meghvdik, az aktulis pldny megjellsre kerl, hogy r a deaktivls vr, miutn a metdus befejezte a futst.Meghvsa:OperationContext.Current.InstanceContext.ReleaseServiceInstance();46