Delen via


Sessie

Het sessievoorbeeld laat zien hoe u een contract implementeert waarvoor een sessie is vereist. Een sessie biedt context voor het uitvoeren van meerdere bewerkingen. Hierdoor kan een service de status koppelen aan een bepaalde sessie, zodat volgende bewerkingen de status van een vorige bewerking kunnen gebruiken. Dit voorbeeld is gebaseerd op aan de slag, waarmee een rekenmachineservice wordt geïmplementeerd. Het ICalculator contract is gewijzigd zodat een set rekenkundige bewerkingen kan worden uitgevoerd, terwijl een actief resultaat behouden blijft. Deze functionaliteit wordt gedefinieerd door het ICalculatorSession contract. De service onderhoudt de status voor een client als meerdere servicebewerkingen worden aangeroepen om een berekening uit te voeren. De client kan het huidige resultaat ophalen door het aanroepen Result() en wissen van het resultaat op nul door aan te roepen Clear().

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.

Het instellen van het SessionMode contract om ervoor te Required zorgen dat wanneer het contract wordt weergegeven via een bepaalde binding, de binding sessies ondersteunt. Als de binding geen ondersteuning biedt voor sessies, wordt er een uitzondering gegenereerd. De ICalculatorSession interface wordt zodanig gedefinieerd dat een of meer bewerkingen kunnen worden aangeroepen, waardoor een actief resultaat wordt gewijzigd, zoals wordt weergegeven in de volgende voorbeeldcode.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
    [OperationContract(IsOneWay=true)]
    void Clear();
    [OperationContract(IsOneWay = true)]
    void AddTo(double n);
    [OperationContract(IsOneWay = true)]
    void SubtractFrom(double n);
    [OperationContract(IsOneWay = true)]
    void MultiplyBy(double n);
    [OperationContract(IsOneWay = true)]
    void DivideBy(double n);
    [OperationContract]
    double Result();
}

De service gebruikt een InstanceContextMode van PerSession om een bepaalde context van een service-exemplaar te binden aan elke binnenkomende sessie. Hierdoor kan de service het actieve resultaat voor elke sessie in een lokale lidvariabele behouden.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class CalculatorService : ICalculatorSession
{
    double result = 0.0D;

    public void Clear()
    {  result = 0.0D; }

    public void AddTo(double n)
    {  result += n;   }

    public void SubtractFrom(double n)
    {  result -= n;   }

    public void MultiplyBy(double n)
    {  result *= n;   }

    public void DivideBy(double n)
    {  result /= n;   }

    public double Result()
    {  return result; }
}

Wanneer u het voorbeeld uitvoert, doet de client verschillende aanvragen naar de server en vraagt het resultaat aan, dat vervolgens wordt weergegeven in het clientconsolevenster. Druk op Enter in het clientvenster om de client af te sluiten.

(((0 + 100) - 50) * 17.65) / 2 = 441.25
Press <ENTER> to terminate client.

Het voorbeeld instellen, compileren en uitvoeren

  1. Zorg ervoor dat u de eenmalige installatieprocedure 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 Het uitvoeren van de Windows Communication Foundation-voorbeelden.