Afficher en anglais

Partage via


OperationContextScope Classe

Définition

Crée un bloc à l'intérieur duquel un objet OperationContext est dans la portée.

C#
public sealed class OperationContextScope : IDisposable
Héritage
OperationContextScope
Implémente

Exemples

L'exemple suivant indique comment utiliser la OperationContextScope pour créer un contexte dans une application cliente afin d'ajouter un en-tête personnalisé au message sortant.

C#
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)
      {
        Console.WriteLine("IsReferenceParameter header detected: " + h.ToString());
      }
    }
    Console.ResetColor();
  }
  #endregion
}

Remarques

Utilisez la classe OperationContextScope pour créer une portée pour un objet OperationContext spécifique ou pour un nouvel objet OperationContext à l'aide d'un objet IContextChannel spécifié. Un OperationContextScope peut être utilisé dans un service Windows Communication Foundation (WCF) ou une application cliente WCF.

Une fois que l'objet OperationContextScope a établi le contexte d'opération actuel, vous pouvez utiliser le OperationContext pour :

  • Accéder aux en-têtes et à d'autres propriétés des messages entrants et sortants et les modifier.

  • Accéder à l’exécution, y compris aux répartiteurs, à l’hôte, au canal et aux extensions.

  • Accéder à d'autres types de contextes, tels que les contextes de sécurité, d'instance et de demande.

  • Accéder au canal associé à l'objet OperationContext ou (si le canal implémente System.ServiceModel.Channels.ISession) à l'identificateur de session du canal associé.

Lorsqu'une OperationContextScope est créée, le OperationContext actuel est stocké et le nouveau OperationContext est celui retourné par la propriété Current. Lorsque la OperationContextScope est supprimée, le OperationContext d'origine est restauré.

Attention

N’utilisez pas le modèle asynchrone « await » dans un bloc OperationContextScope. Lorsque la continuation se produit, elle peut s’exécuter sur un thread différent et OperationContextScope est spécifique au thread. Si vous devez appeler « await » pour un appel asynchrone, utilisez-le en dehors du bloc OperationContextScope.

Constructeurs

OperationContextScope(IContextChannel)

Initialise une nouvelle instance de la classe OperationContextScope qui utilise le IContextChannel spécifié pour créer un OperationContext pour la portée.

OperationContextScope(OperationContext)

Initialise une nouvelle instance de la classe OperationContextScope pour créer une portée pour l'objet OperationContext spécifié.

Méthodes

Dispose()

Rétablit le OperationContext d'origine comme contexte actif et recycle l'objet OperationContextScope.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

S’applique à

Produit Versions
.NET Core 1.0, Core 1.1, 8 (package-provided), 9 (package-provided), 10 (package-provided)
.NET Framework 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0 (package-provided)
UWP 10.0