Instantiëren
In het voorbeeld van instancing ziet u de instelling voor het instancinggedrag, waarmee wordt bepaald hoe exemplaren van een serviceklasse worden gemaakt als reactie op clientaanvragen. Het voorbeeld is gebaseerd op aan de slag, waarmee het ICalculator
servicecontract wordt geïmplementeerd. In dit voorbeeld wordt een nieuw contract gedefinieerd, ICalculatorInstance
dat wordt overgenomen van ICalculator
. Het contract dat is opgegeven door ICalculatorInstance
biedt drie extra bewerkingen voor het inspecteren van de status van het service-exemplaar. Door de instelling voor instancing te wijzigen, kunt u de wijziging in het gedrag observeren door de client uit te voeren.
In dit voorbeeld is de client een consoletoepassing (.exe) en wordt de service gehost door Internet Information Services (IIS).
Notitie
De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.
De volgende instancingmodi zijn beschikbaar:
PerCall: Er wordt een nieuw service-exemplaar gemaakt voor elke clientaanvraag.
PerSession: Er wordt een nieuw exemplaar gemaakt voor elke nieuwe clientsessie en onderhouden voor de levensduur van die sessie (hiervoor is een binding vereist die ondersteuning biedt voor de sessie).
Single: Één exemplaar van de serviceklasse verwerkt alle clientaanvragen voor de levensduur van de toepassing.
De serviceklasse specificeert het gedrag van instancing met het [ServiceBehavior(InstanceContextMode=<setting>)]
kenmerk, zoals wordt weergegeven in het codevoorbeeld dat volgt. Door te wijzigen welke regels worden uitgecommentarieerd, kunt u het gedrag van elk van de exemplaarmodi bekijken. Vergeet niet om de service opnieuw te bouwen nadat u de instancing-modus hebt gewijzigd. Er zijn geen instellingen voor het instancing-gerelateerde instellingen die op de client moeten worden opgegeven.
// Enable one of the following instance modes to compare instancing behaviors.
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
// PerCall creates a new instance for each operation.
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
// Singleton creates a single instance for application lifetime.
//[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class CalculatorService : ICalculatorInstance
{
static Object syncObject = new object();
static int instanceCount;
int instanceId;
int operationCount;
public CalculatorService()
{
lock (syncObject)
{
instanceCount++;
instanceId = instanceCount;
}
}
public double Add(double n1, double n2)
{
operationCount++;
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
Interlocked.Increment(ref operationCount);
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
Interlocked.Increment(ref operationCount);
return n1 * n2;
}
public double Divide(double n1, double n2)
{
Interlocked.Increment(ref operationCount);
return n1 / n2;
}
public string GetInstanceContextMode()
{ // Return the InstanceContextMode of the service
ServiceHost host = (ServiceHost)OperationContext.Current.Host;
ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
return behavior.InstanceContextMode.ToString();
}
public int GetInstanceId()
{ // Return the id for this instance
return instanceId;
}
public int GetOperationCount()
{ // Return the number of ICalculator operations performed
// on this instance
lock (syncObject)
{
return operationCount;
}
}
}
static void Main()
{
// Create a client.
CalculatorInstanceClient client = new CalculatorInstanceClient();
string instanceMode = client.GetInstanceContextMode();
Console.WriteLine("InstanceContextMode: {0}", instanceMode);
DoCalculations(client);
// Create a second client.
CalculatorInstanceClient client2 = new CalculatorInstanceClient();
DoCalculations(client2);
Console.WriteLine();
Console.WriteLine("Press <ENTER> to terminate client.");
Console.ReadLine();
}
Wanneer u het voorbeeld uitvoert, worden de bewerkingsaanvragen en -antwoorden weergegeven in het clientconsolevenster. De instantiemodus waaronder de service wordt uitgevoerd, wordt weergegeven. Na elke bewerking worden de instantie-id en het aantal bewerkingen weergegeven om het gedrag van de instancingmodus weer te geven. Druk op Enter in het clientvenster om de client af te sluiten.
Het voorbeeld instellen, compileren en uitvoeren
Zorg ervoor dat u de eenmalige installatieprocedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.
Als u de C# of Visual Basic .NET-editie van de oplossing wilt bouwen, volgt u de instructies in het bouwen van de Windows Communication Foundation-voorbeelden.
Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Het uitvoeren van de Windows Communication Foundation-voorbeelden.