Instancing
Instancing-exemplet visar inställningen för instancing-beteende, som styr hur instanser av en tjänstklass skapas som svar på klientbegäranden. Exemplet baseras på Komma igång, som implementerar tjänstkontraktet ICalculator
. Det här exemplet definierar ett nytt kontrakt, ICalculatorInstance
, som ärver från ICalculator
. Kontraktet som anges av ICalculatorInstance
tillhandahåller ytterligare tre åtgärder för att inspektera tjänstinstansens tillstånd. Genom att ändra instancing-inställningen kan du observera beteendeförändringen genom att köra klienten.
I det här exemplet är klienten ett konsolprogram (.exe) och tjänsten hanteras av Internet Information Services (IIS).
Kommentar
Installationsproceduren och bygginstruktionerna för det här exemplet finns i slutet av det här avsnittet.
Följande lägen för instancing är tillgängliga:
PerCall: En ny tjänstinstans skapas för varje klientbegäran.
PerSession: En ny instans skapas för varje ny klientsession och underhålls under sessionens livslängd (kräver en bindning som stöder session).
Single: En enda instans av tjänstklassen hanterar alla klientbegäranden under programmets livslängd.
Tjänstklassen anger instancing-beteende med [ServiceBehavior(InstanceContextMode=<setting>)]
attributet som visas i kodexemplet som följer. Genom att ändra vilka rader som kommenteras ut kan du observera beteendet för var och en av instanslägena. Kom ihåg att återskapa tjänsten när du har ändrat instancing-läget. Det finns inga instancing-relaterade inställningar att ange på klienten.
// 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();
}
När du kör exemplet visas åtgärdsbegäranden och svar i klientkonsolfönstret. Instansläget som tjänsten körs under visas. Efter varje åtgärd visas instans-ID och antal åtgärder för att återspegla beteendet för instancing-läget. Tryck på RETUR i klientfönstret för att stänga av klienten.
Så här konfigurerar du, skapar och kör exemplet
Kontrollera att du har utfört engångsinstallationsproceduren för Windows Communication Foundation-exempel.
Om du vill skapa C# eller Visual Basic .NET-versionen av lösningen följer du anvisningarna i Skapa Windows Communication Foundation-exempel.
Om du vill köra exemplet i en konfiguration med en eller flera datorer följer du anvisningarna i Köra Windows Communication Foundation-exempel.