InstanziierungInstancing

Im Beispiel zur Instanziierung wird die Einstellung zum Instanziierungsverhalten veranschaulicht, die steuert, wie Instanzen einer Dienstklasse als Reaktion auf Clientanforderungen erstellt werden.The Instancing sample demonstrates the instancing behavior setting, which controls how instances of a service class are created in response to client requests. Das Beispiel basiert auf der Einstieg, implementiert die ICalculator Dienstvertrag.The sample is based on the Getting Started, which implements the ICalculator service contract. In diesem Beispiel wird ein neuer Vertrag (ICalculatorInstance) definiert, der von ICalculator erbt.This sample defines a new contract, ICalculatorInstance, which inherits from ICalculator. Der von ICalculatorInstance angegebene Vertrag stellt drei zusätzliche Vorgänge zum Überprüfen des Zustands der Dienstinstanz bereit.The contract specified by ICalculatorInstance provides three additional operations for inspecting the state of the service instance. Indem Sie die Einstellung für die Instanziierung ändern, können Sie Änderungen im Verhalten beobachten, wenn Sie den Client ausführen.By altering the instancing setting, you can observe the change in behavior by running the client.

In diesem Beispiel ist der Client eine Konsolenanwendung (.exe), und der Dienst wird von IIS (Internet Information Services, Internetinformationsdienste) gehostet.In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS).

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.The setup procedure and build instructions for this sample are located at the end of this topic.

Es stehen die folgenden Instanziierungsmodi zur Verfügung:The following instancing modes are available:

  • PerCall: Für jede Clientanforderung wird eine neue Instanz erstellt.PerCall: A new service instance is created for each client request.

  • PerSession: Für jede neue Clientsitzung wird eine neue Instanz erstellt und für die Lebensdauer dieser Sitzung aufrechterhalten. Hierfür ist eine Bindung erforderlich, die Sitzungen unterstützt.PerSession: A new instance is created for each new client session, and maintained for the lifetime of that session (requires a binding that supports session).

  • Single: Alle Clientanforderungen werden während der Lebensdauer der Anwendung von einer Instanz der Dienstklasse verarbeitet.Single: A single instance of the service class handles all client requests for the lifetime of the application.

Die Dienstklasse gibt das Instanziierungsverhalten mit dem [ServiceBehavior(InstanceContextMode=<setting>)]-Attribut an, wie im folgenden Beispielcode dargestellt.The service class specifies instancing behavior with the [ServiceBehavior(InstanceContextMode=<setting>)] attribute as shown in the code sample that follows. Indem Sie unterschiedliche Zeilen auskommentieren, können Sie das Verhalten der einzelnen Instanzmodi beobachten.By changing which lines are commented out, you can observe the behavior of each of the instance modes. Denken Sie daran, den Dienst nach dem Ändern des Instanziierungsmodus neu zu erstellen.Remember to rebuild the service after changing the instancing mode. Es gibt keine Einstellungen in Bezug auf die Instanziierung, die auf dem Client angegeben werden.There are no instancing-related settings to specify on the client.

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

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt.When you run the sample, the operation requests and responses are displayed in the client console window. Es wird der Instanzmodus angezeigt, unter dem der Dienst ausgeführt wird.The instance mode the service is running under is displayed. Nach jedem Vorgang werden die Instanz-ID und die Vorgangsanzahl angezeigt, um das Verhalten des Instanziierungsmodus darzustellen.After each operation, the instance ID and operation count are displayed to reflect the behavior of the instancing mode. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.Press ENTER in the client window to shut down the client.

So können Sie das Beispiel einrichten, erstellen und ausführenTo set up, build, and run the sample

  1. Stellen Sie sicher, dass Sie ausgeführt haben die Setupprozedur für die Windows Communication Foundation-Beispiele zum einmaligen.Ensure that you have performed the One-Time Setup Procedure for the Windows Communication Foundation Samples.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.To build the C# or Visual Basic .NET edition of the solution, follow the instructions in Building the Windows Communication Foundation Samples.

  3. Um das Beispiel in einer einzelnen oder computerübergreifenden Konfiguration ausführen möchten, folgen Sie den Anweisungen Ausführen der Windows Communication Foundation-Beispiele.To run the sample in a single- or cross-machine configuration, follow the instructions in Running the Windows Communication Foundation Samples.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WCF\Basic\Services\Behaviors\Instancing

Siehe auchSee Also