OperationContextScope OperationContextScope OperationContextScope OperationContextScope Class

Definición

Crea un bloque dentro del cual un objeto OperationContext se encontrará dentro del ámbito.Creates a block within which an OperationContext object is in scope.

public ref class OperationContextScope sealed : IDisposable
public sealed class OperationContextScope : IDisposable
type OperationContextScope = class
    interface IDisposable
Public NotInheritable Class OperationContextScope
Implements IDisposable
Herencia
OperationContextScopeOperationContextScopeOperationContextScopeOperationContextScope
Implementaciones

Ejemplos

El ejemplo siguiente muestra cómo utilizar OperationContextScope para crear un nuevo contexto en una aplicación cliente con objeto de agregar un encabezado personalizado al mensaje saliente.The following example shows how to use the OperationContextScope to create a new context in a client application to add a custom header to the outgoing message.

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;
 
public class Client : ISampleServiceCallback
{
  ManualResetEvent wait = null;

  Client()
  {
    this.wait = new ManualResetEvent(false);
  }

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

  void Run()
  {
    // Picks up configuration from the config file.
    SampleServiceClient wcfClient = new SampleServiceClient(new InstanceContext(this));
    try
    {
      using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel))
      {
        MessageHeader header
          = MessageHeader.CreateHeader(
          "Service-Bound-CustomHeader",
          "http://Microsoft.WCF.Documentation",
          "Custom Happy Value."
          );
        OperationContext.Current.OutgoingMessageHeaders.Add(header);

        // Making calls.
        Console.WriteLine("Enter the greeting to send: ");
        string greeting = Console.ReadLine();

        //Console.ReadLine();
        header = MessageHeader.CreateHeader(
            "Service-Bound-OneWayHeader",
            "http://Microsoft.WCF.Documentation",
            "Different Happy Value."
          );
        OperationContext.Current.OutgoingMessageHeaders.Add(header);

        // One-way
        wcfClient.Push(greeting);
        this.wait.WaitOne();

        // Done with service. 
        wcfClient.Close();
        Console.WriteLine("Done!");
        Console.ReadLine();
      }
    }
    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();
    }
  }


  #region ISampleServiceCallback Members

  public void PushBack(string msg)
  {
    Console.WriteLine("Service said: " + msg);
    this.WriteHeaders(OperationContext.Current.IncomingMessageHeaders);
    this.wait.Set();
  }

  void WriteHeaders(MessageHeaders headers)
  {
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("IncomingHeader:");
    Console.ForegroundColor = ConsoleColor.Blue;
    foreach (MessageHeaderInfo h in headers)
    {
      if (!h.Actor.Equals(String.Empty))
        Console.WriteLine("\t" + h.Actor);
      Console.ForegroundColor = ConsoleColor.White;
      Console.WriteLine("\t" + h.Name);
      Console.ForegroundColor = ConsoleColor.Blue;
      Console.WriteLine("\t" + h.Namespace);
      Console.WriteLine("\t" + h.Relay);
      if (h.IsReferenceParameter == true)
      {
        Console.WriteLine("IsReferenceParameter header detected: " + h.ToString());
      }
    }
    Console.ResetColor();
  }
  #endregion

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

Public Class Client
    Implements ISampleServiceCallback
  Private wait As ManualResetEvent = Nothing

  Private Sub New()
    Me.wait = New ManualResetEvent(False)
  End Sub

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

  Private Sub Run()
    ' Picks up configuration from the config file.
    Dim wcfClient As New SampleServiceClient(New InstanceContext(Me))
    Try
      Using scope As New OperationContextScope(wcfClient.InnerChannel)
                Dim header As MessageHeader = MessageHeader.CreateHeader("Service-Bound-CustomHeader", _
                                    "http://Microsoft.WCF.Documentation", "Custom Happy Value.")
        OperationContext.Current.OutgoingMessageHeaders.Add(header)

        ' Making calls.
        Console.WriteLine("Enter the greeting to send: ")
        Dim greeting As String = Console.ReadLine()

        'Console.ReadLine();
                header = MessageHeader.CreateHeader("Service-Bound-OneWayHeader", _
                                                    "http://Microsoft.WCF.Documentation", "Different Happy Value.")
        OperationContext.Current.OutgoingMessageHeaders.Add(header)

        ' One-way
        wcfClient.Push(greeting)
        Me.wait.WaitOne()

        ' Done with service. 
        wcfClient.Close()
        Console.WriteLine("Done!")
        Console.ReadLine()
      End Using
    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


  #Region "ISampleServiceCallback Members"

  Public Sub PushBack(ByVal msg As String) Implements ISampleServiceCallback.PushBack
    Console.WriteLine("Service said: " & msg)
    Me.WriteHeaders(OperationContext.Current.IncomingMessageHeaders)
    Me.wait.Set()
  End Sub

  Private Sub WriteHeaders(ByVal headers As MessageHeaders)
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("IncomingHeader:")
    Console.ForegroundColor = ConsoleColor.Blue
    For Each h As MessageHeaderInfo In headers
      If Not h.Actor.Equals(String.Empty) Then
        Console.WriteLine(vbTab & h.Actor)
      End If
      Console.ForegroundColor = ConsoleColor.White
      Console.WriteLine(vbTab & h.Name)
      Console.ForegroundColor = ConsoleColor.Blue
      Console.WriteLine(vbTab & h.Namespace)
      Console.WriteLine(vbTab & h.Relay)
      If h.IsReferenceParameter = True Then
        Console.WriteLine("IsReferenceParameter header detected: " & h.ToString())
      End If
    Next h
    Console.ResetColor()
  End Sub
  #End Region

End Class

Comentarios

Utilice la clase OperationContextScope para crear un ámbito para un objeto OperationContext concreto o un ámbito para un nuevo objeto OperationContext utilizando un objeto IContextChannel especificado.Use the OperationContextScope class to create a scope for a specific OperationContext object or a scope for a new OperationContext object using a specified IContextChannel object. Se puede usar OperationContextScope en un servicio de Windows Communication Foundation (WCF) o una aplicación cliente de WCF.An OperationContextScope can be used in a Windows Communication Foundation (WCF) service or WCF client application.

Cuando el objeto OperationContextScope ha establecido el contexto de la operación actual, puede utilizar OperationContext para:Once the OperationContextScope object has established the current operation context, you can use the OperationContext to:

  • Acceder y modificar los encabezados de mensajes entrantes y salientes y demás propiedades.Access and modify incoming and outgoing message headers and other properties.

  • Tener acceso al tiempo de ejecución, incluidos los distribuidores, el host, el canal y las extensiones.Access the runtime, including dispatchers, the host, channel, and extensions.

  • Tener acceso a otros tipos de contextos, como la seguridad, la instancia y los contextos de la solicitud.Access other types of contexts, such as security, instance, and request contexts.

  • Tener acceso al canal asociado al objeto OperationContext o (si el canal implementa System.ServiceModel.Channels.ISession) el identificador de sesión del canal asociado.Access the channel associated with the OperationContext object or (if the channel implements System.ServiceModel.Channels.ISession) the associated channel's session identifier.

Cuando se crea OperationContextScope, el OperationContext actual está almacenado y el nuevo OperationContext será el que devuelva la propiedad Current.When an OperationContextScope is created, the current OperationContext is stored and the new OperationContext becomes the one returned by the Current property. Cuando se dispone OperationContextScope, se restaura el OperationContext original.When the OperationContextScope is disposed, the original OperationContext is restored.

Advertencia

No use el patrón asincrónico "Await" dentro de un bloque OperationContextScope.Do not use the asynchronous "await" pattern within a OperationContextScope block. Cuando se produce la continuación, se puede ejecutar en un subproceso diferente y OperationContextScope es específico del subproceso.When the continuation occurs, it may run on a different thread and OperationContextScope is thread specific. Si tiene que llamar a "Await" para una llamada asincrónica, úsela fuera del bloque OperationContextScope.If you need to call "await" for an async call, use it outside of the OperationContextScope block.

Constructores

OperationContextScope(IContextChannel) OperationContextScope(IContextChannel) OperationContextScope(IContextChannel) OperationContextScope(IContextChannel)

Inicializa un nueva instancia de la clase OperationContextScope que utiliza el IContextChannel especificado para crear un nuevo OperationContext para el ámbito.Initializes a new instance of the OperationContextScope class that uses the specified IContextChannel to create a new OperationContext for the scope.

OperationContextScope(OperationContext) OperationContextScope(OperationContext) OperationContextScope(OperationContext) OperationContextScope(OperationContext)

Inicializa un nueva instancia de la clase OperationContextScope para crear un ámbito para el objeto OperationContext especificado.Initializes a new instance of the OperationContextScope class to create a scope for the specified OperationContext object.

Métodos

Dispose() Dispose() Dispose() Dispose()

Restaura el OperationContext original al contexto activo y recicla el objeto OperationContextScope.Restores the original OperationContext to the active context and recycles the OperationContextScope object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina si el objeto especificado es igual al objeto actual.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Sirve como la función hash predeterminada.Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

Obtiene el Type de la instancia actual.Gets the Type of the current instance.

(Inherited from Object)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficial del objeto Object actual.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Devuelve una cadena que representa el objeto actual.Returns a string that represents the current object.

(Inherited from Object)

Se aplica a