Pri delu v WCF se morate zavedati konceptov instanciranja, dušenja in sočasnosti za gradnjo storitev, ki so razširljive in lahko zagotavljajo boljšo pretočnost.
Regulacija v WCF se uporablja za omejevanje pretoka storitve, tako da je poraba virov (pomnilnik, procesor, disk, omrežje itd.) V sistemu na sprejemljivi ravni, tj. Zagotovite, da storitev ne porablja virov preko sprejemljivih meja. Razred ServiceThrottlingBehavior se lahko uporablja za nadzor uspešnosti storitev WCF.
Sočasnost
V WCF lahko pride do težav s sočasnostjo, ko dve ali več niti hkrati poskušata dostopati do istega vira. Upoštevajte, da lahko storitev WCF hkrati obravnava eno samo zahtevo. Sočasnost v WCF vam omogoča nadzor več aktivnih niti v InstanceContext v določenem trenutku. V bistvu vam pomaga konfigurirati število primerkov storitve, ki lahko postrežejo z več hkratnimi zahtevami. Tri možne vrste sočasnih načinov vključujejo naslednje:
Način enojne sočasnosti: V tem načinu ima lahko vsak kontekst primerka največ eno nit, ki lahko obdeluje zahtevo v določenem trenutku. Ko prispe naslednja zahteva, mora počakati, da je prva zahteva izpolnjena. To zahteva tudi sinhronizacijske ključavnice. Naslednji delček kode prikazuje, kako je mogoče uporabiti način enojne sočasnosti.
[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Single)]
storitev javnega razreda: IServiceContract
{
javni niz GetMessage ()
{
vrnitev "Pozdravljen svet!";
}
}
Večkratni način sočasnosti: V tem načinu storitev omogoča, da več niti istočasno dostopa do storitve. V načinu večkratne sočasnosti ima vsaka storitev WCF več niti, ki lahko istočasno obdelajo dohodne zahteve.
[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Multiple)]
storitev javnega razreda: IServiceContract
{
samo za branje objekt lockObj = nov objekt ();
javni niz GetMessage ()
{
string sporočilo = string.Empty;
zaklepanje (lockObj)
{
message = "Pozdravljen svet!";
}
povratno sporočilo;
}
}
Način sočasne preusmeritve: Čeprav lahko v načinu ponovnega vstopa posamezna nit dostopa do predmeta storitve, lahko nit še vedno zapusti storitev in nato pokliče drugo storitev. Naslednji delček kode prikazuje, kako lahko uporabite ta način.
[ServiceBehavior (ConcurrencyMode = ConcurrencyMode.Reentrant)]
storitev javnega razreda: IServiceContract
{
javni niz GetMessage ()
{
vrnitev "Pozdravljen svet!";
}
}
Lastnost InstanceContextMode se uporablja za določanje, kdaj bo ustvarjen primerek storitve in njegova trajnost. Upoštevajte, da sta InstanceContextMode in ConcurrencyMode podana s pomočjo ServiceBehaviorAttribute. Tri razpoložljive vrednosti kontekstnega načina primerka vključujejo: PerCall, PerSession in Single. V načinu PerCall je storitev enojna in brez državljanstva. Način PerSession je privzeti in se uporablja, kadar želite med klici, ki jih je poslal isti potrošnik, ohranjati informacije o stanju. Enotni način se uporablja, kadar mora vaša storitev vzdrževati podatke o stanju med odjemalci in vam v prihodnje ne bi bilo treba razširiti storitve.
Dušenje
Z uporabo dušilke lahko nadzorujete in optimizirate porabo virov ter dosežete način za uravnoteženje zmogljivosti storitve. Reguliranje v WCF je mogoče konfigurirati tako deklarativno kot programsko.
Lastnosti maxConcurrentCalls, maxConcurrentInsests, maxConcurrentSessions lahko konfigurirate deklarativno z uporabo oznake v konfiguracijski datoteki storitve, kot je prikazano v spodnjem delčku kode.
maxConcurrentInsistance
maxConcurrentSessions />
Lastnost maxConcurrentCalls se uporablja za omejitev skupnega števila klicev v vseh primerkih storitve. Privzeta vrednost je 16 na procesor. Lastnost maxConcurrentInsests se uporablja za določanje skupnega števila primerkov storitve, ki jih je mogoče dodeliti v določenem trenutku. Privzeta vrednost te lastnosti je Int32.MaxValue. Lastnost maxConcurrentSessions se uporablja za določanje skupnega števila sočasnih aktivnih sej, ki je dovoljeno za storitev v danem trenutku. Privzeta vrednost je 100 na procesor.
Zdaj, ko vemo, kako deklarativno nastaviti dušenje storitev v WCF, raziščimo, kako lahko programsko konfiguriramo dušenje storitev v WCF. Če želite programsko konfigurirati dušenje storitev v WCF, morate izkoristiti razred ServiceThrottlingBehavior. Naslednji seznam kod prikazuje, kako lahko izkoristite razred ServiceThrottlingBehavior za konfiguriranje sočasnih klicev, lastnosti seje in primerka.
ServiceHost serviceHost = nov ServiceHost (typeof (Service));
ServiceThrottlingBehavior throttleBehavior = serviceHost.Description.Behaviors.Find ();
če (throttleBehavior == null)
{
throttleBehavior = novo ServiceThrottlingBehavior ();
throttleBehavior.MaxConcurrentCalls = 1000;
throttleBehavior.MaxConcurrentSessions = 250;
throttleBehavior.MaxConcurrentInsistance = 500;
serviceHost.Description.Behaviors.Add (throttleBehavior);
}
V zgornjem delčku kode se ustvari primerek ServiceThrottlingBehaviour in njegove lastnosti nastavijo na ustrezne vrednosti. Nato se ta primerek doda zbirki vedenj primerka gostitelja storitve.