OperationContext Clase

Definición

Proporciona acceso al contexto de ejecución de un método de servicio.

public ref class OperationContext sealed : System::ServiceModel::IExtensibleObject<System::ServiceModel::OperationContext ^>
public sealed class OperationContext : System.ServiceModel.IExtensibleObject<System.ServiceModel.OperationContext>
type OperationContext = class
    interface IExtensibleObject<OperationContext>
Public NotInheritable Class OperationContext
Implements IExtensibleObject(Of OperationContext)
Herencia
OperationContext
Implementaciones

Ejemplos

En el ejemplo de código siguiente se usa la propiedad y GetCallbackChannel el Current método para obtener el canal de vuelta al autor de la llamada desde dentro de un método . Todos los métodos en este ejemplo son unidireccionales, lo que permite que el servicio y el cliente se comuniquen en ambas direcciones de manera independiente. En este caso, la aplicación cliente de ejemplo espera sólo una llamada de devolución antes de salir, pero otro cliente; por ejemplo, un cliente de Windows Forms, puede recibir cualquier número de llamadas desde el servicio.

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  [ServiceContract(
    Name = "SampleDuplexHello",
    Namespace = "http://microsoft.wcf.documentation",
    CallbackContract = typeof(IHelloCallbackContract),
    SessionMode = SessionMode.Required
  )]
  public interface IDuplexHello
  {
    [OperationContract(IsOneWay = true)]
    void Hello(string greeting);
  }

  public interface IHelloCallbackContract
  {
    [OperationContract(IsOneWay = true)]
    void Reply(string responseToGreeting);
  }

  public class DuplexHello : IDuplexHello
  {
    public DuplexHello()
    {
      Console.WriteLine("Service object created: " + this.GetHashCode().ToString());
    }

    ~DuplexHello()
    {
      Console.WriteLine("Service object destroyed: " + this.GetHashCode().ToString());
    }

    public void Hello(string greeting)
    {
      Console.WriteLine("Caller sent: " + greeting);
      Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
      Console.WriteLine("Waiting two seconds before returning call.");
      // Put a slight delay to demonstrate asynchronous behavior on client.
      Thread.Sleep(2000);
      IHelloCallbackContract callerProxy
        = OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
      string response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
      Console.WriteLine("Sending back: " + response);
      callerProxy.Reply(response);
    }
  }
}


Imports System.Collections.Generic
Imports System.ServiceModel
Imports System.Threading

Namespace Microsoft.WCF.Documentation
    <ServiceContract(Name:="SampleDuplexHello", Namespace:="http://microsoft.wcf.documentation", _
                     CallbackContract:=GetType(IHelloCallbackContract), SessionMode:=SessionMode.Required)> _
  Public Interface IDuplexHello
        <OperationContract(IsOneWay:=True)> _
        Sub Hello(ByVal greeting As String)
    End Interface

  Public Interface IHelloCallbackContract
    <OperationContract(IsOneWay := True)> _
    Sub Reply(ByVal responseToGreeting As String)
  End Interface

  Public Class DuplexHello
      Implements IDuplexHello
    Public Sub New()
      Console.WriteLine("Service object created: " & Me.GetHashCode().ToString())
    End Sub

    Protected Overrides Sub Finalize()
      Console.WriteLine("Service object destroyed: " & Me.GetHashCode().ToString())
    End Sub

    Public Sub Hello(ByVal greeting As String) Implements IDuplexHello.Hello
      Console.WriteLine("Caller sent: " & greeting)
      Console.WriteLine("Session ID: " & OperationContext.Current.SessionId)
      Console.WriteLine("Waiting two seconds before returning call.")
      ' Put a slight delay to demonstrate asynchronous behavior on client.
      Thread.Sleep(2000)
            Dim callerProxy = OperationContext.Current.GetCallbackChannel(Of IHelloCallbackContract)()
            Dim response = "Service object " & Me.GetHashCode().ToString() & " received: " & greeting
      Console.WriteLine("Sending back: " & response)
      callerProxy.Reply(response)
    End Sub
  End Class
End Namespace

El siguiente cliente implementa para SampleDuplexHelloCallback recibir el mensaje de devolución de llamada. El contrato de devolución de llamada importado no es el mismo nombre que el del servicio, debido al uso de la Name propiedad en el ejemplo anterior. Observe que el cliente no hace ninguna suposición sobre si podría recibir una devolución de llamada o cuándo; la devolución de llamada del servidor es completamente independiente de la llamada saliente del cliente.

Nota

Para obtener un ejemplo que usa la OperationContext clase en un escenario de cliente, vea OperationContextScope.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;

namespace Microsoft.WCF.Documentation
{
  public class Client : SampleDuplexHelloCallback
  {
    AutoResetEvent waitHandle;

    public Client()
    {
      waitHandle = new AutoResetEvent(false);
    }

    public void Run()
    {
      // Picks up configuration from the config file.
      SampleDuplexHelloClient wcfClient
        = new SampleDuplexHelloClient(new InstanceContext(this));
      try
      {
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Enter a greeting to send and press ENTER: ");
        Console.Write(">>> ");
        Console.ForegroundColor = ConsoleColor.Green;
        string greeting = Console.ReadLine();
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("Called service with: \r\n\t" + greeting);
        wcfClient.Hello(greeting);
        Console.WriteLine("Execution passes service call and moves to the WaitHandle.");
        this.waitHandle.WaitOne();
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.WriteLine("Set was called.");
        Console.Write("Press ");
        Console.ForegroundColor = ConsoleColor.Red;
        Console.Write("ENTER");
        Console.ForegroundColor = ConsoleColor.Blue;
        Console.Write(" to exit...");
        Console.ReadLine();
        wcfClient.Close();
      }
      catch (TimeoutException timeProblem)
      {
        Console.WriteLine("The service operation timed out. " + timeProblem.Message);
        Console.ReadLine();
        wcfClient.Abort();
      }
      catch (CommunicationException commProblem)
      {
        Console.WriteLine("There was a communication problem. " + commProblem.Message);
        Console.ReadLine();
        wcfClient.Abort();
      }
    }

    public static void Main()
    {
      Client client = new Client();
      client.Run();
    }

    public void Reply(string response)
    {
      Console.WriteLine("Received output.");
      Console.WriteLine("\r\n\t" + response);
      this.waitHandle.Set();
    }
  }
}

Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Threading

Namespace Microsoft.WCF.Documentation
  Public Class Client
      Implements SampleDuplexHelloCallback
    Private waitHandle As AutoResetEvent

    Public Sub New()
      waitHandle = New AutoResetEvent(False)
    End Sub

    Public Sub Run()
      ' Picks up configuration from the config file.
      Dim wcfClient As New SampleDuplexHelloClient(New InstanceContext(Me))
      Try
        Console.ForegroundColor = ConsoleColor.White
        Console.WriteLine("Enter a greeting to send and press ENTER: ")
        Console.Write(">>> ")
        Console.ForegroundColor = ConsoleColor.Green
                Dim greeting = Console.ReadLine()
        Console.ForegroundColor = ConsoleColor.White
        Console.WriteLine("Called service with: " & Constants.vbCrLf & Constants.vbTab & greeting)
        wcfClient.Hello(greeting)
        Console.WriteLine("Execution passes service call and moves to the WaitHandle.")
        Me.waitHandle.WaitOne()
        Console.ForegroundColor = ConsoleColor.Blue
        Console.WriteLine("Set was called.")
        Console.Write("Press ")
        Console.ForegroundColor = ConsoleColor.Red
        Console.Write("ENTER")
        Console.ForegroundColor = ConsoleColor.Blue
        Console.Write(" to exit...")
        Console.ReadLine()
        wcfClient.Close()
      Catch timeProblem As TimeoutException
        Console.WriteLine("The service operation timed out. " & timeProblem.Message)
        Console.ReadLine()
        wcfClient.Abort()
      Catch commProblem As CommunicationException
        Console.WriteLine("There was a communication problem. " & commProblem.Message)
        Console.ReadLine()
        wcfClient.Abort()
      End Try
    End Sub

    Public Shared Sub Main()
      Dim client As New Client()
      client.Run()
    End Sub

    Public Sub Reply(ByVal response As String) Implements SampleDuplexHelloCallback.Reply
      Console.WriteLine("Received output.")
      Console.WriteLine(Constants.vbCrLf & Constants.vbTab & response)
      Me.waitHandle.Set()
    End Sub
  End Class
End Namespace

Comentarios

Use desde OperationContext dentro de una operación de servicio para acceder al entorno de ejecución de la operación actual. En particular, el contexto de la operación se utiliza para tener acceso a los canales de devolución de llamada en servicios dúplex, almacenar datos de estado adicionales en partes de las operaciones, y para tener acceso a los encabezados de mensaje entrante y propiedades así como agregar encabezados de mensajes salientes y propiedades.

Para obtener más información sobre el uso de extensiones para almacenar datos de estado, vea Objetos extensibles.

OperationContext tiene las siguientes propiedades y métodos.

Constructores

OperationContext(IContextChannel)

Inicializa una nueva instancia de la clase OperationContext que usa el IContextChannel especificado en una aplicación cliente.

Propiedades

Channel

Obtiene el canal asociado con el objeto OperationContext actual.

ClaimsPrincipal

Obtiene la entidad de seguridad basada en notificaciones asociada con la operación.

Current

Obtiene o define el contexto de ejecución del subproceso actual.

EndpointDispatcher

Obtiene o establece el distribuidor del extremo para el extremo que se vaya a inspeccionar o modificar.

Extensions

Recibe la colección de extensiones de servicio desde el contexto del mensaje actual.

HasSupportingTokens

Obtiene un valor que indica si el mensaje entrante tiene tokens auxiliares.

Host

Obtiene ServiceHost para el objeto de servicio actual.

IncomingMessageHeaders

Obtiene los encabezados de mensaje entrante para OperationContext.

IncomingMessageProperties

Obtiene las propiedades de mensaje para el mensaje entrante en OperationContext.

IncomingMessageVersion

Obtiene la versión del mensaje SOAP entrante para OperationContext.

InstanceContext

Obtiene el objeto InstanceContext que administra la instancia del servicio actual.

IsUserContext

Esta propiedad está pensada para su uso por el sistema y los usuarios no deberían recurrir a ella.

OutgoingMessageHeaders

Obtiene los encabezados de mensajes salientes para el OperationContext activo.

OutgoingMessageProperties

Obtiene las propiedades del mensaje para el mensaje saliente en el OperationContext activo.

RequestContext

Obtiene o define la implementación de RequestContext para este método.

ServiceSecurityContext

Obtiene o define ServiceSecurityContext dentro del cual se ejecuta este método.

SessionId

Obtiene el String utilizado para identificar la sesión actual.

SupportingTokens

Obtiene un ICollection<T> de tipo SecurityToken.

Métodos

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetCallbackChannel<T>()

Obtiene un canal a la instancia del cliente que haya llamado a la operación actual.

GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
SetTransactionComplete()

Confirma la transacción que se está ejecutando actualmente.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Eventos

OperationCompleted

Se produce cuando se ha completado la operación.

Se aplica a