ServiceBehaviorAttribute.InstanceContextMode Eigenschaft

Definition

Ruft den Wert ab, der angibt, wenn neue Dienstobjekte erstellt werden, oder legt diesen Wert fest.Gets or sets the value that indicates when new service objects are created.

public:
 property System::ServiceModel::InstanceContextMode InstanceContextMode { System::ServiceModel::InstanceContextMode get(); void set(System::ServiceModel::InstanceContextMode value); };
public System.ServiceModel.InstanceContextMode InstanceContextMode { get; set; }
member this.InstanceContextMode : System.ServiceModel.InstanceContextMode with get, set
Public Property InstanceContextMode As InstanceContextMode

Eigenschaftswert

Einer der InstanceContextMode-Werte; der Standardwert ist PerSession.One of the InstanceContextMode values; the default value is PerSession.

Ausnahmen

Der Wert ist keiner der InstanceContextMode-Werte.The value is not one of the InstanceContextMode values.

Beispiele

Im folgenden Codebeispiel werden die ServiceBehaviorAttribute-Eigenschaften veranschaulicht.The following code example demonstrates the ServiceBehaviorAttribute properties. Die BehaviorService-Klasse verwendet das ServiceBehaviorAttribute-Attribut, um Folgendes anzugeben:The BehaviorService class uses the ServiceBehaviorAttribute attribute to indicate that:

  • Implementierungsmethoden werden auf dem UI-Thread aufgerufen.Implementation methods are invoked on the UI thread.

  • Es gibt ein Dienstobjekt für jede Sitzung.There is one service object for each session.

  • Der Dienst ist ein Singlethread und unterstützt keine wiedereintrittsfähigen Aufrufe.The service is single-threaded and does not support reentrant calls.

Darüber hinaus geben die OperationBehaviorAttribute-Werte auf Vorgangsebene an, dass die TxWork-Methode automatisch in Transaktionsflüsse eingetragen wird oder eine neue Transaktion zum Durchführen der Aufgaben erstellt, und dass für die Transaktion automatisch ein Commit ausgeführt wird, wenn keine nicht behandelte Ausnahme auftritt.Furthermore, at the operation level, the OperationBehaviorAttribute values indicate that the TxWork method automatically enlists in flowed transactions or creates a new transaction to do the work, and that the transaction is committed automatically if an unhandled exception does not occur.

using System;
using System.ServiceModel;
using System.Transactions;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Namespace="http://microsoft.wcf.documentation", 
    SessionMode=SessionMode.Required
  )]
  public interface IBehaviorService
  {
    [OperationContract]
    string TxWork(string message);
  }

  // Note: To use the TransactionIsolationLevel property, you 
  // must add a reference to the System.Transactions.dll assembly.
  /* The following service implementation:
   *   -- Processes messages on one thread at a time
   *   -- Creates one service object per session
   *   -- Releases the service object when the transaction commits
   */
  [ServiceBehavior(
    ConcurrencyMode=ConcurrencyMode.Single,
    InstanceContextMode=InstanceContextMode.PerSession,
    ReleaseServiceInstanceOnTransactionComplete=true
  )]
  public class BehaviorService : IBehaviorService, IDisposable
  {
    Guid myID;

    public BehaviorService()
    {
      myID = Guid.NewGuid();
      Console.WriteLine(
        "Object "
        + myID.ToString()
        + " created.");
    }

    /*
     * The following operation-level behaviors are specified:
     *   -- The executing transaction is committed when
     *        the operation completes without an 
     *        unhandled exception
     *   -- Always executes under a flowed transaction.
     */
    [OperationBehavior(
      TransactionAutoComplete = true,
      TransactionScopeRequired = true
    )]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    public string TxWork(string message)
    {
      // Do some transactable work.
      Console.WriteLine("TxWork called with: " + message);
      // Display transaction information.

      TransactionInformation info = Transaction.Current.TransactionInformation;
      Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier);
      Console.WriteLine("The tx status: {0}.", info.Status);
      return String.Format("Hello. This was object {0}.",myID.ToString()) ;
    }

    public void Dispose()
    {
      Console.WriteLine(
        "Service "
        + myID.ToString()
        + " is being recycled."
      );
    }
  }
}
Imports System.ServiceModel
Imports System.Transactions

Namespace Microsoft.WCF.Documentation
  <ServiceContract(Namespace:="http://microsoft.wcf.documentation", SessionMode:=SessionMode.Required)> _
  Public Interface IBehaviorService
    <OperationContract> _
    Function TxWork(ByVal message As String) As String
  End Interface

  ' Note: To use the TransactionIsolationLevel property, you 
  ' must add a reference to the System.Transactions.dll assembly.
'   The following service implementation:
'   *   -- Processes messages on one thread at a time
'   *   -- Creates one service object per session
'   *   -- Releases the service object when the transaction commits
'   
    <ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Single, InstanceContextMode:=InstanceContextMode.PerSession, _
                     ReleaseServiceInstanceOnTransactionComplete:=True)> _
    Public Class BehaviorService
        Implements IBehaviorService, IDisposable
        Private myID As Guid

        Public Sub New()
            myID = Guid.NewGuid()
            Console.WriteLine("Object " & myID.ToString() & " created.")
        End Sub

        '    
        '     * The following operation-level behaviors are specified:
        '     *   -- The executing transaction is committed when
        '     *        the operation completes without an 
        '     *        unhandled exception
        '     *   -- Always executes under a flowed transaction.
        '     
        <OperationBehavior(TransactionAutoComplete:=True, TransactionScopeRequired:=True), TransactionFlow(TransactionFlowOption.Mandatory)> _
        Public Function TxWork(ByVal message As String) As String Implements IBehaviorService.TxWork
            ' Do some transactable work.
            Console.WriteLine("TxWork called with: " & message)
            ' Display transaction information.

            Dim info As TransactionInformation = Transaction.Current.TransactionInformation
            Console.WriteLine("The distributed tx ID: {0}.", info.DistributedIdentifier)
            Console.WriteLine("The tx status: {0}.", info.Status)
            Return String.Format("Hello. This was object {0}.", myID.ToString())
        End Function

        Public Sub Dispose() Implements IDisposable.Dispose
            Console.WriteLine("Service " & myID.ToString() & " is being recycled.")
        End Sub
    End Class
End Namespace

Die zugrunde liegende Bindung muss Transaktionsflüsse unterstützen, damit das folgende Codebeispiel ordnungsgemäß ausgeführt wird.The underlying binding must support flowed transactions for the following code example to execute properly. Um Transaktionsflüsse mit WSHttpBinding zu unterstützen, legen Sie zum Beispiel die TransactionFlow-Eigenschaft im Code oder in einer Anwendungskonfigurationsdatei auf true fest.To support flowed transactions using the WSHttpBinding, for example, set the TransactionFlow property to true in code or in an application configuration file. Das folgende Codebeispiel zeigt die Konfigurationsdatei für das vorhergehende Beispiel.The following code example shows the configuration file for the preceding sample.

<configuration>
  <system.serviceModel>
    <services>
      <service  
        name="Microsoft.WCF.Documentation.BehaviorService" 
        behaviorConfiguration="metadataAndDebugEnabled"
      >
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/SampleService"/>
          </baseAddresses>
        </host>
        <!--
          Note:
            This example code uses the WSHttpBinding to support transactions using the 
            WS-AtomicTransactions (WS-AT) protocol. WSHttpBinding is configured to use the  
            protocol, but the protocol is not enabled on some computers. Use the xws_reg -wsat+ 
            command to enable the WS-AtomicTransactions protocol in the MSDTC service.          
          -->
        <endpoint 
           contract="Microsoft.WCF.Documentation.IBehaviorService"
           binding="wsHttpBinding"
           bindingConfiguration="wsHttpBindingWithTXFlow"
           address="http://localhost:8080/BehaviorService"
          />
        <endpoint 
           contract="Microsoft.WCF.Documentation.IBehaviorService"
           binding="netTcpBinding"
           bindingConfiguration="netTcpBindingWithTXFlow"
           address="net.tcp://localhost:8081/BehaviorService"
          />
        <endpoint
          address="mex"
          binding="mexHttpBinding"
          contract="IMetadataExchange"
        />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metadataAndDebugEnabled">
          <serviceDebug
            includeExceptionDetailInFaults="true"
          />
          <serviceMetadata
            httpGetEnabled="true"
            httpGetUrl=""
          />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- binding configuration - configures a WSHttpBinding to require transaction flow -->
    <bindings>
      <wsHttpBinding>
        <binding name="wsHttpBindingWithTXFlow" transactionFlow="true" />
      </wsHttpBinding>
      <netTcpBinding>
        <binding name="netTcpBindingWithTXFlow" transactionFlow="true" />
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

Hinweise

Verwenden Sie die InstanceContextMode-Eigenschaft, um anzugeben, wann neue Dienstobjekte erstellt werden.Use the InstanceContextMode property to specify when new service objects are created. Da das Dienstobjekt nicht direkt mit dem Kommunikationskanal verknüpft ist, hängt die Lebensdauer der Dienstobjekte nicht von der Lebensdauer des Kanals zwischen einem Client und der Dienstanwendung ab.Because the service object is not directly connected to the communicating channel, the lifetime of the service objects is independent of the lifetime of the channel between a client and the service application. Der Standardwert PerSession weist die Dienstanwendung an, ein neues Dienstobjekt zu erstellen, wenn eine neue Kommunikationssitzung zwischen einem Client und der Dienstanwendung hergestellt wird.The default value, PerSession, instructs the service application to create a new service object when a new communication session is established between a client and the service application. Nachfolgende Aufrufe in der gleichen Sitzung werden vom gleichen Objekt behandelt.Subsequent calls in the same session are handled by the same object.

PerSession gibt an, dass jedes Dienstobjekt Anforderungen eines Clientkanals verarbeitet.PerSession indicates that each service object handles requests from one client channel.

Hinweis

Die InstanceContextMode-Eigenschaft interagiert mit einigen anderen Einstellungen.The InstanceContextMode property interacts with some other settings. Wenn der InstanceContextMode-Wert zum Beispiel auf Single festgelegt ist, kann der Dienst als Ergebnis nur jeweils eine Nachricht verarbeiten, es sei denn, Sie legen den ConcurrencyMode-Wert gleichzeitig auf Multiple fest.For example, if the InstanceContextMode value is set to Single the result is that your service can only process one message at a time unless you also set the ConcurrencyMode value to Multiple. Diese Eigenschaft erzeugt ebenfalls Verhalten in Verbindung mit der ServiceContractAttribute.SessionMode-Eigenschaft.This property also produces behavior in combination with the ServiceContractAttribute.SessionMode property. Weitere Informationen finden Sie unter Sitzungen, Instanziierung undParallelität.For details, see Sessions, Instancing, and Concurrency.

Beim Laufzeitverhalten von Singleton-Klassen (z. B. wenn die Hostanwendung den ServiceHost-Konstruktor aufruft und ein Objekt zur Verwendung als Dienst übergibt), muss die Serviceklasse InstanceContextMode auf Single festgelegt werden, oder es wird zur Laufzeit eine Ausnahme ausgelöst.For singleton lifetime behavior (for example, if the host application calls the ServiceHost constructor and passes an object to use as the service), the service class must set InstanceContextMode to Single, or an exception is thrown at run time.

Gilt für: