Share via


ServiceBehaviorAttribute.InstanceContextMode Özellik

Tanım

Yeni hizmet nesnelerinin ne zaman oluşturulduğunu gösteren değeri alır veya ayarlar.

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

Özellik Değeri

Değerlerden InstanceContextMode biri; varsayılan değerdir PerSession.

Özel durumlar

Değer değerlerden InstanceContextMode biri değildir.

Örnekler

Aşağıdaki kod örneği özellikleri gösterir ServiceBehaviorAttribute . sınıfı, BehaviorService aşağıdakileri belirtmek için özniteliğini ServiceBehaviorAttribute kullanır:

  • Uygulama yöntemleri kullanıcı arabirimi iş parçacığında çağrılır.

  • Her oturum için bir hizmet nesnesi vardır.

  • Hizmet tek iş parçacıklıdır ve yeniden gelen çağrıları desteklemez.

Ayrıca, işlem düzeyinde değerler yöntemin OperationBehaviorAttributeTxWork akışlı işlemlere otomatik olarak listelendiğini veya işi yapmak için yeni bir işlem oluşturduğunu ve işlenmeyen bir özel durum oluşmazsa işlemin otomatik olarak işlendiğini gösterir.

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

Aşağıdaki kod örneğinin düzgün yürütülmesi için temel bağlamanın akışlı işlemleri desteklemesi gerekir. kullanarak akışlı işlemleri WSHttpBindingdesteklemek için örneğin, özelliğini true kodda veya uygulama yapılandırma dosyasında olarak ayarlayınTransactionFlow. Aşağıdaki kod örneği, önceki örneğin yapılandırma dosyasını gösterir.

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

Açıklamalar

Yeni hizmet nesnelerinin InstanceContextMode ne zaman oluşturulacağını belirtmek için özelliğini kullanın. Hizmet nesnesi iletişim kanalına doğrudan bağlı olmadığından, hizmet nesnelerinin ömrü bir istemci ile hizmet uygulaması arasındaki kanalın ömründen bağımsızdır. Varsayılan değer olan PerSession, bir istemci ile hizmet uygulaması arasında yeni bir iletişim oturumu oluşturulduğunda hizmet uygulamasına yeni bir hizmet nesnesi oluşturma talimatı verir. Aynı oturumdaki sonraki çağrılar aynı nesne tarafından işlenir.

PerSession her hizmet nesnesinin bir istemci kanalından gelen istekleri işlediğini gösterir.

Not

InstanceContextMode özelliği diğer bazı ayarlarla etkileşim kurar. Örneğin, değer sonuca ayarlanırsaInstanceContextMode, değeri olarak ayarlamadığınız sürece hizmetinizin bir kerede yalnızca bir iletiyi işleyebileceğidirMultipleConcurrencyMode.Single Bu özellik ayrıca özelliğiyle ServiceContractAttribute.SessionMode birlikte davranış üretir. Ayrıntılar için bkz . Oturumlar, Tutarsızlık ve Eşzamanlılık.

Tekil yaşam süresi davranışı için (örneğin, konak uygulaması oluşturucuyu ServiceHost çağırır ve hizmet olarak kullanmak üzere bir nesne geçirirse), hizmet sınıfı olarak Singleayarlanmalıdır InstanceContextMode veya çalışma zamanında bir özel durum oluşturulur.

Şunlara uygulanır