WCF - Instanzverwaltung
Die von WCF verwendeten Techniken zum Binden einer Reihe von Nachrichten (Clientanforderungen) an Dienstinstanzen werden als Instanzverwaltung bezeichnet. WCF unterstützt drei Arten der Instanzaktivierung, die in diesem Kapitel erläutert werden.
Per-Call-Service
Der Anrufdienst ist der Standardinstanzaktivierungsmodus von WCF. Wenn ein WCF-Dienst für einen Anrufdienst konfiguriert ist, wird ein CLR-Objekt für die Zeitspanne erstellt, in der ein Clientanruf oder eine Anforderung ausgeführt wird. CLR steht für Common Language Runtime und enthält Dienstinstanzen in WCF.
Beim Anrufdienst erreicht jede Clientanforderung eine neue dedizierte Dienstinstanz, und der Speicherverbrauch ist im Vergleich zu anderen Arten der Instanzaktivierung geringer.
Die InstanceContextMode-Eigenschaft muss auf InstanceContextMode.PerCall festgelegt werden, um einen WCF-Dienst anzugeben, der als Anrufdienst fungiert. Die InstanceContextMode-Eigenschaft gehört zum ServiceBehavior-Attribut. Daher kann ein Anrufdienst wie folgt konfiguriert werden:
[ServiceContract]
interface IMyContract
{...}
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{...}
Ein Service wird hier als IMyContract ausgedrückt. Die folgende Abbildung zeigt den Prozess der Aktivierung der Dienstinstanz pro Anruf.
Implementieren eines Per-Call-Dienstes
[DataContract]
class Param {....}
[ServiceContract]
interface IMyContract {
[OperationContract]
void MyMethod(Param objectIdentifier);
}
class MyPerCallService : IMyContract, IDisposable {
public void MyMethod(Param objectIdentifier) {
GetState(objectIdentifier);
DoWork();
SaveState(objectIdentifier);
}
void GetState(Param objectIdentifier) {....}
void DoWork() {....}
void SaveState(Param objectIdentifier) {....}
public void Dispose() {....}
}
Hier ist Param der Pseudotyp-Parameter, der für das obige Beispiel erfunden wurde.
Service pro Sitzung
In diesem Aktivierungsmodus von WCF wird eine private oder eine vertrauliche Sitzung zwischen den beiden Entitäten, dh dem Client und einer bestimmten Dienstinstanz, aufrechterhalten. Der Sitzungsdienst, der auch als privater Sitzungsdienst bezeichnet wird, bietet eine neue Dienstinstanz, die für jede Clientanforderung reserviert bleibt und unabhängig von allen anderen Instanzen ist, die diesen sitzungsbewussten Dienst betreffen.
Um einen Sitzungsdienst zu initiieren, muss die InstanceContextMode-Eigenschaft auf PerSession festgelegt werden. Hier bleibt die Dienstinstanz während der gesamten Sitzungsdauer im Speicher.
Der Aktivierungsmodus leidet unter Skalierbarkeit, da der konfigurierte Dienst aufgrund der mit jeder dieser dedizierten Dienstinstanzen verbundenen Kosten keine weiteren ausstehenden Clients außer einigen wenigen (oder möglicherweise bis zu einigen hundert) unterstützen kann.
Ein Dienst pro Sitzung kann wie folgt konfiguriert werden:
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract
{...}
Der Prozess des Sitzungsdienstes kann wie in der folgenden Abbildung dargestellt beschrieben werden:
Der folgende Code zeigt einen Vertrag und einen Dienst, die für die Verwendung einer privaten Sitzung konfiguriert sind. Die Ausgabe zeigt an, dass der Client tatsächlich eine dedizierte Dienstinstanz erhalten hat.
Service code
[ServiceContract(Session = true)]
interface IMyContract {
[OperationContract]
void MyMethod();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IMyContract, IDisposable {
int m_Counter = 0; MyService() {Console.WriteLine("MyService.MyService()"); }
public void MyMethod() {
m_Counter++;
Console.WriteLine("Counter = " + m_Counter);
}
public void Dispose() {
Console.WriteLine("MyService.Dispose()");
}
}
Kundencode
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod();
proxy.Close();
Ausgabe
MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()
Singleton Service
In diesem Aktivierungsmodus von WCF werden alle voneinander unabhängigen Clientanforderungen unabhängig von ihrer Verbindung zu den Dienstendpunkten mit derselben bekannten Einzelinstanz verbunden. Der Singleton-Dienst wird nur entsorgt, wenn der Host geschlossen wird.
Dieser Dienst wird nur einmal erstellt, wenn der Host erstellt wird. Falls dem Host keine Singleton-Instanz bereitgestellt wird, wird der Dienst als NULL zurückgegeben. Der Aktivierungsmodus ist am besten, wenn der Arbeitsaufwand in jedem Methodenaufruf gering ist und keine ausstehenden Vorgänge im Hintergrund vorhanden sind.
Die InstanceContextMode-Eigenschaft muss auf InstanceContextMode.Single festgelegt werden, um diesen Singleton-Dienst zu initiieren.
Daher kann ein Singleton-Dienst wie folgt konfiguriert werden:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : ...
{...}
Der Prozess des Singleton-Dienstes ist in der folgenden Abbildung dargestellt:
Der folgende Code wird zum Initialisieren und Hosten einer Singleton-Instanz verwendet.
Service code
[ServiceContract]
interface IMyContract {
[OperationContract]
void MyMethod( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class MySingleton : IMyContract {
int m_Counter = 0;
public int Counter {
get {
return m_Counter;
}
set {
m_Counter = value;
}
}
public void MyMethod( ) {
m_Counter++;
Trace.WriteLine("Counter = " + Counter);
}
}
Host-Code
MySingleton singleton = new MySingleton( );
singleton.Counter = 42;
ServiceHost host = new ServiceHost(singleton);
host.Open( );
//Do some blocking calls then
host.Close( );
Client-Code
MyContractClient proxy = new MyContractClient( );
proxy.MyMethod( );
proxy.Close( );
Ausgabe
Counter = 43