OperationContext Classe

Definizione

Consente di accedere al contesto di esecuzione di un metodo di servizio.Provides access to the execution context of a service method.

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)
Ereditarietà
OperationContext
Implementazioni

Esempi

Nell'esempio di codice seguente la proprietà Current e il metodo GetCallbackChannel vengono utilizzati per ottenere dall'interno di un metodo il canale di ritorno al chiamante.The following code example uses the Current property and GetCallbackChannel method to obtain the channel back to the caller from within a method. Tutti i metodi descritti in questo esempio sono metodi unidirezionali che consentono al servizio e al clienti di comunicare in modo indipendente in entrambe le direzioni.All methods in this example are one-way methods, enabling the service and the client to communicate in both directions independently. In questo caso l'applicazione client descritta nell'esempio prevede di ricevere una sola chiamata di ritorno prima di terminare la propria esecuzione. Tuttavia un altro client, ad esempio un client Windows Forms, può ricevere un numero qualsiasi di chiamate dal servizio.In this case, the example client application expects only one return call before it exits, but another client, for example a Windows Forms client, can receive any number of calls from the service.

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

Il client seguente implementa il callback SampleDuplexHelloCallback per ricevere il messaggio callback.The following client implements the SampleDuplexHelloCallback to receive the callback message. A causa dell'utilizzo della proprietà Name nell'esempio precedente, il nome del contratto callback importato non corrisponde a quello del servizio.The imported callback contract is not the same name as the one in the service, due to the use of the Name property in the preceding example. Si noti che il client non fa alcuna ipotesi sulla possibilità di ricevere un callback e sul momento in cui può riceverlo. Il callback del server è completamente indipendente dalla chiamata in uscita del client.Note that the client makes no assumptions about whether or when it might receive a callback; the server callback is entirely independent of the client's outbound call.

Nota

Per un esempio in cui la classe OperationContext è utilizzata in uno scenario client, vedere OperationContextScope.For an example that uses the OperationContext class in a client scenario, see 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

Commenti

Utilizzare il contesto OperationContext dall'interno di un'operazione di servizio per accedere all'ambiente di esecuzione dell'operazione corrente.Use the OperationContext from within a service operation to access the current operation execution environment. In particolare, il contesto dell'operazione viene utilizzato per accedere ai canali callback nei servizi duplex, per archiviare dati aggiuntivi sullo stato in più parti delle operazioni, per accedere alle intestazioni e alle proprietà dei messaggi in ingresso e per aggiungere intestazioni e proprietà ai messaggi in uscita.In particular, the operation context is used to access callback channels in duplex services, to store extra state data across portions of the operations, and to access incoming message headers and properties as well as add outgoing message headers and properties.

Per ulteriori informazioni sull'utilizzo delle estensioni per archiviare i dati sullo stato, vedere oggetti estensibili.For more information about using extensions to store state data, see Extensible Objects.

Il contesto OperationContext presenta le proprietà e i metodi seguenti:The OperationContext has the following properties and methods.

Costruttori

OperationContext(IContextChannel)

Consente di inizializzare una nuova istanza della classe OperationContext che utilizza l'interfaccia IContextChannel specificata in un'applicazione client.Initializes a new instance of the OperationContext class that uses the specified IContextChannel in a client application.

Proprietà

Channel

Consente di ottenere il canale associato all'oggetto OperationContext corrente.Gets the channel associated with the current OperationContext object.

ClaimsPrincipal

Ottiene il principale basato sulle attestazioni associato all'operazione.Gets the claims-based principal associated with the operation.

Current

Consente di ottenere o impostare il contesto di esecuzione del thread corrente.Gets or sets the execution context for the current thread.

EndpointDispatcher

Consente di ottenere o impostare il dispatcher dell'endpoint da esaminare o modificare.Gets or sets the endpoint dispatcher for the endpoint to inspect or modify.

Extensions

Consente di ottenere la raccolta delle estensioni di servizio a partire dal contesto corrente dei messaggi.Gets the collection of service extensions from the current message context.

HasSupportingTokens

Ottiene un valore che indica se il messaggio in ingresso presenta token di supporto.Gets a value that indicates whether the incoming message has supporting tokens.

Host

Ottiene l'oggetto ServiceHost dell'oggetto di servizio corrente.Gets the ServiceHost for the current service object.

IncomingMessageHeaders

Consente di ottenere le intestazioni dei messaggi in ingresso relative al contesto OperationContext.Gets the incoming message headers for the OperationContext.

IncomingMessageProperties

Consente di ottenere le proprietà dei messaggi in ingresso nel contesto OperationContext.Gets the message properties for the incoming message in the OperationContext.

IncomingMessageVersion

Consente di ottenere la versione del messaggio SOAP in ingresso del contesto OperationContext.Gets the incoming SOAP message version for the OperationContext.

InstanceContext

Consente di ottenere l'oggetto InstanceContext che gestisce l'istanza di servizio corrente.Gets the InstanceContext object that manages the current service instance.

IsUserContext

Questa proprietà è destinata all'utilizzo da parte del sistema e non deve essere chiamata dagli utenti.This property is intended for system use and should not be called by users.

OutgoingMessageHeaders

Consente di ottenere le intestazioni dei messaggi in uscita relative al contesto OperationContext attivo.Gets the outgoing message headers for the active OperationContext.

OutgoingMessageProperties

Consente di ottenere le proprietà dei messaggi in uscita nel contesto OperationContext attivo.Gets the message properties for the outbound message in the active OperationContext.

RequestContext

Consente di ottenere o impostare l'implementazione del contesto RequestContext di questo metodo.Gets or sets the RequestContext implementation for this method.

ServiceSecurityContext

Consente di ottenere o impostare il contesto ServiceSecurityContext in cui viene eseguito questo metodo.Gets or sets the ServiceSecurityContext within which this method executes.

SessionId

Consente di ottenere la stringa String utilizzata per identificare la sessione corrente.Gets the String used to identify the current session.

SupportingTokens

Consente di ottenere un'interfaccia ICollection<T> di tipo SecurityToken.Gets a ICollection<T> of type SecurityToken.

Metodi

Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object.

(Ereditato da Object)
GetCallbackChannel<T>()

Consente di ottenere un canale per l'istanza client che ha chiamato l'operazione corrente.Gets a channel to the client instance that called the current operation.

GetHashCode()

Funge da funzione hash predefinita.Serves as the default hash function.

(Ereditato da Object)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

(Ereditato da Object)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Ereditato da Object)
SetTransactionComplete()

Consente di eseguire il commit della transazione correntemente in fase di esecuzione.Commits the currently executing transaction.

ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Ereditato da Object)

Eventi

OperationCompleted

Si verifica al termine dell'operazione.Occurs when the operation has completed.

Si applica a