ServiceBehaviorAttribute.InstanceContextMode ServiceBehaviorAttribute.InstanceContextMode ServiceBehaviorAttribute.InstanceContextMode ServiceBehaviorAttribute.InstanceContextMode Property

Definición

Obtiene o establece el valor que indica cuándo se crean los nuevos objetos de servicio.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

Valor de propiedad

Uno de los valores InstanceContextMode; el valor predeterminado es PerSession.One of the InstanceContextMode values; the default value is PerSession.

Excepciones

Ejemplos

En el ejemplo de código siguiente se muestran las propiedades ServiceBehaviorAttribute.The following code example demonstrates the ServiceBehaviorAttribute properties. La clase BehaviorService utiliza el atributo ServiceBehaviorAttribute para indicar que:The BehaviorService class uses the ServiceBehaviorAttribute attribute to indicate that:

  • Los métodos de implementación se invocan en el subproceso de la interfaz de usuario.Implementation methods are invoked on the UI thread.

  • Hay un objeto de servicio para cada sesión.There is one service object for each session.

  • La instancia del servicio es de subproceso único y no admite llamadas reentrantes.The service is single-threaded and does not support reentrant calls.

Además, en el nivel de la operación, los valores OperationBehaviorAttribute indican que el método TxWork da de alta automáticamente las transacciones de flujo o crea una transacción nueva para hacer el trabajo y que se confirma la transacción automáticamente si no se produce una excepción no controlada.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

El enlace subyacente debe admitir transacciones de flujo para que el ejemplo de código siguiente se ejecute correctamente.The underlying binding must support flowed transactions for the following code example to execute properly. Para admitir transacciones de flujo con WSHttpBinding, por ejemplo, establezca la propiedad TransactionFlow como true en el código o en un archivo de configuración de la aplicación.To support flowed transactions using the WSHttpBinding, for example, set the TransactionFlow property to true in code or in an application configuration file. El ejemplo de código siguiente muestra el archivo de configuración para el ejemplo anterior: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>

Comentarios

Utilice la propiedad InstanceContextMode para especificar cuándo se crean los nuevos objetos de servicio.Use the InstanceContextMode property to specify when new service objects are created. Dado que el objeto de servicio no está conectado directamente al canal de la comunicación, la duración de los objetos de servicio es independiente de la duración del canal entre un cliente y la aplicación de servicio.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. El valor predeterminado, PerSession, indica a la aplicación de servicio que cree un nuevo objeto de servicio cuando se establezca una nueva sesión de comunicaciones entre un cliente y la aplicación de servicio.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. El mismo objeto administra las llamadas subsiguientes en la misma sesión.Subsequent calls in the same session are handled by the same object.

PerSession indica que cada objeto de servicio administra las solicitudes de un canal de cliente.PerSession indicates that each service object handles requests from one client channel.

Nota

La propiedad InstanceContextMode interactúa con algunos otros valores.The InstanceContextMode property interacts with some other settings. Por ejemplo, si el valor InstanceContextMode está establecido como Single, el resultado será que su servicio sólo puede procesar un mensaje a la vez a menos que también establezca el valor de ConcurrencyMode como Multiple.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. Esta propiedad también genera comportamiento en combinación con la propiedad ServiceContractAttribute.SessionMode.This property also produces behavior in combination with the ServiceContractAttribute.SessionMode property. Para obtener más información, consulte sesiones, Instancing y simultaneidad.For details, see Sessions, Instancing, and Concurrency.

En el caso del comportamiento de duración de singleton (por ejemplo, si la aplicación host llama al constructor ServiceHost y pasa un objeto que se utilice como el servicio), la clase del servicio debe establecer InstanceContextMode como Single o se inicia una excepción en tiempo de ejecución.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.

Se aplica a