Leggi in inglese

Condividi tramite


OperationContextScope Classe

Definizione

Consente di creare un blocco che definisce l'ambito di un oggetto OperationContext.

C#
public sealed class OperationContextScope : IDisposable
Ereditarietà
OperationContextScope
Implementazioni

Esempio

Nell'esempio seguente viene illustrato come utilizzare l'ambito OperationContextScope per creare un nuovo contesto in un'applicazione client per aggiungere un'intestazione personalizzata al messaggio in uscita.

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
}

Commenti

Utilizzare la classe OperationContextScope per creare l'ambito di un oggetto OperationContext specifico o l'ambito di un nuovo oggetto OperationContext tramite l'oggetto IContextChannel specificato. Un OperationContextScope oggetto può essere usato in un servizio Windows Communication Foundation (WCF) o in un'applicazione client WCF.

Dopo che l'oggetto OperationContextScope ha stabilito il contesto dell'operazione corrente, il contesto OperationContext può essere utilizzato per:

  • Accedere e modificare le intestazioni e le altre proprietà dei messaggi in ingresso e in uscita.

  • Accedere al runtime, compresi dispatcher, host, canale ed estensioni.

  • Accedere agli altri tipi di contesto, ad esempio ai contesti di sicurezza, istanza e richiesta.

  • Accedere al canale associato all'oggetto OperationContext o, se il canale implementa l'interfaccia System.ServiceModel.Channels.ISession, all'identificatore di sessione del canale associato.

Quando si crea un ambito OperationContextScope, il contesto OperationContext corrente viene archiviato e il nuovo contesto OperationContext diventa quello restituito dalla proprietà Current. Quando l'ambito OperationContextScope viene eliminato, il contesto originale OperationContext viene ripristinato.

Avviso

Non usare il modello "await" asincrono all'interno di un blocco OperationContextScope. Quando si verifica la continuazione, può essere eseguita in un thread diverso e OperationContextScope è specifico del thread. Se è necessario chiamare "await" per una chiamata asincrona, usarlo all'esterno del blocco OperationContextScope.

Costruttori

OperationContextScope(IContextChannel)

Consente di inizializzare una nuova istanza della classe OperationContextScope che utilizza l'interfaccia IContextChannel specificata per creare un nuovo contesto OperationContext dell'ambito.

OperationContextScope(OperationContext)

Consente di inizializzare una nuova istanza della classe OperationContextScope per creare un ambito dell'oggetto OperationContext specificato.

Metodi

Dispose()

Consente di ripristinare il contesto OperationContext originale al contesto attivo e di riciclare l'oggetto OperationContextScope.

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.

(Ereditato da Object)
GetHashCode()

Funge da funzione hash predefinita.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Si applica a

Prodotto Versioni
.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