ServiceBehaviorAttribute.InstanceContextMode Właściwość

Definicja

Pobiera lub ustawia wartość, która wskazuje, kiedy są tworzone nowe obiekty usługi.

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

Wartość właściwości

InstanceContextMode Jedną z wartości. Wartość domyślna to PerSession.

Wyjątki

Wartość nie jest jedną z InstanceContextMode wartości.

Przykłady

Poniższy przykład kodu przedstawia ServiceBehaviorAttribute właściwości. Klasa BehaviorService używa atrybutu ServiceBehaviorAttribute , aby wskazać, że:

  • Metody implementacji są wywoływane w wątku interfejsu użytkownika.

  • Dla każdej sesji istnieje jeden obiekt usługi.

  • Usługa jest jednowątkowa i nie obsługuje wywołań reentrant.

Ponadto na poziomie operacji wartości wskazują, OperationBehaviorAttribute że TxWork metoda automatycznie zaciąga się do przepływanych transakcji lub tworzy nową transakcję do wykonania pracy, a transakcja jest zatwierdzana automatycznie, jeśli nieobsługiwany wyjątek nie występuje.

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

Powiązanie bazowe musi obsługiwać przepływane transakcje dla następującego przykładu kodu w celu prawidłowego wykonania. Aby obsługiwać przepływy transakcji przy użyciu WSHttpBindingelementu , na przykład ustaw TransactionFlow właściwość na true wartość w kodzie lub w pliku konfiguracji aplikacji. Poniższy przykład kodu przedstawia plik konfiguracji dla poprzedniego przykładu.

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

Uwagi

InstanceContextMode Użyj właściwości , aby określić, kiedy są tworzone nowe obiekty usługi. Ponieważ obiekt usługi nie jest bezpośrednio połączony z kanałem komunikacyjnym, okres istnienia obiektów usługi jest niezależny od okresu istnienia kanału między klientem a aplikacją usługi. Wartość domyślna , PerSessionpowoduje, że aplikacja usługi utworzy nowy obiekt usługi, gdy zostanie ustanowiona nowa sesja komunikacji między klientem a aplikacją usługi. Kolejne wywołania w tej samej sesji są obsługiwane przez ten sam obiekt.

PerSession wskazuje, że każdy obiekt usługi obsługuje żądania z jednego kanału klienta.

Uwaga

Właściwość InstanceContextMode współdziała z innymi ustawieniami. Jeśli na przykład InstanceContextMode wartość jest ustawiona na Single wynik, usługa może przetworzyć tylko jeden komunikat naraz, chyba że ustawisz ConcurrencyMode również wartość na Multiple. Ta właściwość powoduje również zachowanie w połączeniu z właściwością ServiceContractAttribute.SessionMode . Aby uzyskać szczegółowe informacje, zobacz Sesje, Tworzenie wystąpienia i Współbieżność.

W przypadku zachowania pojedynczego okresu istnienia (na przykład jeśli aplikacja hosta wywołuje ServiceHost konstruktora i przekazuje obiekt do użycia jako usługa), klasa usługi musi ustawić Singlewartość InstanceContextMode , lub wyjątek jest zgłaszany w czasie wykonywania.

Dotyczy