Udostępnij za pośrednictwem


Tworzenie wystąpienia

W przykładzie Instancing pokazano ustawienie zachowania instancingu, które kontroluje sposób tworzenia wystąpień klasy usługi w odpowiedzi na żądania klientów. Przykład jest oparty na rozpoczynaniu pracy, która implementuje ICalculator kontrakt usługi. W tym przykładzie zdefiniowano nowy kontrakt , ICalculatorInstancektóry dziedziczy z ICalculatorklasy . Kontrakt określony przez ICalculatorInstance program zapewnia trzy dodatkowe operacje na potrzeby inspekcji stanu wystąpienia usługi. Zmieniając ustawienie instancingu, możesz obserwować zmianę zachowania, uruchamiając klienta.

W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Dostępne są następujące tryby stancingu:

  • PerCall: dla każdego żądania klienta jest tworzone nowe wystąpienie usługi.

  • PerSession: nowe wystąpienie jest tworzone dla każdej nowej sesji klienta i utrzymywane przez okres istnienia tej sesji (wymaga powiązania obsługującego sesję).

  • Single: pojedyncze wystąpienie klasy usługi obsługuje wszystkie żądania klientów przez okres istnienia aplikacji.

Klasa usługi określa zachowanie instancing z atrybutem [ServiceBehavior(InstanceContextMode=<setting>)] , jak pokazano w przykładzie kodu, który następuje poniżej. Zmieniając, które wiersze są komentowane, można obserwować zachowanie poszczególnych trybów wystąpienia. Pamiętaj, aby ponownie skompilować usługę po zmianie trybu instancingu. Na kliencie nie ma ustawień związanych ze stanem instancingu.

// 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();
}

Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Zostanie wyświetlony tryb wystąpienia, w którym działa usługa. Po każdej operacji identyfikator wystąpienia i liczba operacji są wyświetlane w celu odzwierciedlenia zachowania trybu instancingu. Naciśnij klawisz ENTER w oknie klienta, aby zamknąć klienta.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.