Freigeben über


OperationContext Klasse

Definition

Bietet Zugriff auf den Ausführungskontext einer Dienstmethode.

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)
Vererbung
OperationContext
Implementiert

Beispiele

Im folgenden Codebeispiel wird die Current Eigenschaft und GetCallbackChannel Methode verwendet, um den Kanal zurück zum Aufrufer innerhalb einer Methode abzurufen. Alle Methoden in diesem Beispiel sind unidirektionale Methoden, wodurch der Dienst und der Client unabhängig voneinander kommunizieren können. In diesem Fall erwartet die Beispielclientanwendung nur einen Rückgabeaufruf, bevor er beendet wird, aber ein anderer Client, z. B. ein Windows Forms-Client, kann eine beliebige Anzahl von Anrufen vom Dienst empfangen.

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

Der folgende Client implementiert den SampleDuplexHelloCallback Empfang der Rückrufnachricht. Der importierte Rückrufvertrag ist aufgrund der Verwendung der Name Eigenschaft im vorherigen Beispiel nicht derselbe Name wie der im Dienst enthaltene. Beachten Sie, dass der Client keine Annahmen darüber vorgibt, ob oder wann er einen Rückruf erhält; Der Serverrückruf ist vollständig unabhängig vom ausgehenden Anruf des Clients.

Hinweis

Ein Beispiel, das die OperationContext Klasse in einem Clientszenario verwendet, finden Sie unter 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

Hinweise

Verwenden Sie die OperationContext Daten aus einem Dienstvorgang, um auf die aktuelle Ausführungsumgebung des Vorgangs zuzugreifen. Insbesondere wird der Vorgangskontext verwendet, um auf Rückrufkanäle in Duplexdiensten zuzugreifen, zusätzliche Zustandsdaten in Teilen der Vorgänge zu speichern und auf eingehende Nachrichtenkopfzeilen und -eigenschaften zuzugreifen sowie Ausgehende Nachrichtenkopfzeilen und -eigenschaften hinzuzufügen.

Weitere Informationen zum Verwenden von Erweiterungen zum Speichern von Statusdaten finden Sie unter Extensible Objects.

Die OperationContext folgenden Eigenschaften und Methoden sind verfügbar.

Konstruktoren

Name Beschreibung
OperationContext(IContextChannel)

Initialisiert eine neue Instanz der OperationContext Klasse, die die in einer Clientanwendung angegebene IContextChannel verwendet.

Eigenschaften

Name Beschreibung
Channel

Ruft den Kanal ab, der dem aktuellen OperationContext Objekt zugeordnet ist.

ClaimsPrincipal

Ruft den anspruchsbasierten Prinzipal ab, der dem Vorgang zugeordnet ist.

Current

Dient zum Abrufen oder Festlegen des Ausführungskontexts für den aktuellen Thread.

EndpointDispatcher

Dient zum Abrufen oder Festlegen des Endpunkt-Verteilers für den Endpunkt, der überprüft oder geändert werden soll.

Extensions

Ruft die Sammlung von Diensterweiterungen aus dem aktuellen Nachrichtenkontext ab.

HasSupportingTokens

Ruft einen Wert ab, der angibt, ob die eingehende Nachricht unterstützende Token enthält.

Host

Ruft das ServiceHost aktuelle Dienstobjekt ab.

IncomingMessageHeaders

Ruft die Kopfzeilen für eingehende Nachrichten für die OperationContext.

IncomingMessageProperties

Ruft die Nachrichteneigenschaften für die eingehende Nachricht in der OperationContext.

IncomingMessageVersion

Ruft die eingehende SOAP-Nachrichtenversion für die OperationContext.

InstanceContext

Ruft das InstanceContext Objekt ab, das die aktuelle Dienstinstanz verwaltet.

IsUserContext

Diese Eigenschaft ist für die Systemverwendung vorgesehen und sollte nicht von Benutzern aufgerufen werden.

OutgoingMessageHeaders

Ruft die Kopfzeilen für ausgehende Nachrichten für das aktive OperationContext.

OutgoingMessageProperties

Ruft die Nachrichteneigenschaften für die ausgehende Nachricht in der aktiven OperationContextab.

RequestContext

Ruft die RequestContext Implementierung für diese Methode ab oder legt sie fest.

ServiceSecurityContext

Dient zum Abrufen oder Festlegen des ServiceSecurityContext Werts, in dem diese Methode ausgeführt wird.

SessionId

Ruft die String verwendet, um die aktuelle Sitzung zu identifizieren.

SupportingTokens

Ruft einen ICollection<T> Typ ab SecurityToken.

Methoden

Name Beschreibung
Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetCallbackChannel<T>()

Ruft einen Kanal zur Clientinstanz ab, die den aktuellen Vorgang aufgerufen hat.

GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
SetTransactionComplete()

Führt einen Commit für die aktuell ausgeführte Transaktion durch.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Ereignisse

Name Beschreibung
OperationCompleted

Tritt auf, wenn der Vorgang abgeschlossen ist.

Gilt für: