Delen via


Instantiering

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 de Getting Started, waarmee het ICalculator service contract wordt geïmplementeerd. In dit voorbeeld wordt een nieuw contract gedefinieerd, ICalculatorInstancedat wordt overgenomen van ICalculator. Het contract gespecificeerd door ICalculatorInstance biedt drie extra bewerkingen voor het controleren van de status van de service-instantie. Door de instelling voor instancing te wijzigen, kunt u door de client uit te voeren de wijziging in het gedrag observeren.

In dit voorbeeld is de client een consoletoepassing (.exe) en wordt de service gehost door Internet Information Services (IIS).

Opmerking

De installatieprocedure en build-instructies voor dit voorbeeld bevinden zich aan het einde van dit onderwerp.

De volgende instancingmodussen 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 die gerelateerd zijn aan instancing 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

  1. Zorg ervoor dat u de One-Time Setup Procedure voor de Windows Communication Foundation-voorbeelden hebt uitgevoerd.

  2. 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.

  3. Als u het voorbeeld wilt uitvoeren in een configuratie met één of meerdere computers, volgt u de instructies in Windows Communication Foundation-voorbeelden uitvoeren.