OperationContext Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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 werden die Current -Eigenschaft und GetCallbackChannel -Methode verwendet, um den Kanal aus einer -Methode zurück an den Aufrufer abzurufen. Alle in diesem Beispiel verwendeten Methoden sind unidirektionale Methoden, die für den Dienst und den Client eine unabhängige Kommunikation in beide Richtungen ermöglichen. In diesem Fall erwartet die Beispielclientanwendung nur einen Rückgabeaufruf, bevor er beendet wird. Ein anderer Client, wie zum Beispiel ein Windows Forms-Client kann jedoch eine beliebige Anzahl Aufrufe von dem Dienst erhalten.
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
, um die Rückrufnachricht zu empfangen. Der importierte Rückrufvertrag hat aufgrund der Verwendung der Eigenschaft im vorherigen Beispiel nicht den gleichen Namen wie der Name im Dienst. Beachten Sie, dass der Client keine Annahmen trifft, ob oder wann er einen Rückruf erhalten könnte. Der Serverrückruf ist völlig unabhängig vom ausgehenden Aufruf 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 von innerhalb eines Dienstvorgangs, um auf die aktuelle Ausführungsumgebung des Vorgangs zuzugreifen. Der Vorgangskontext wird insbesondere für den Zugriff auf Rückrufkanal in Duplexdiensten eingesetzt, um zusätzliche Statusdaten für verschiedene Vorgangsbereiche zu speichern und auf eingehende Nachrichtenheader und -eigenschaften zuzugreifen sowie um ausgehende Nachrichtenheader und -eigenschaften hinzuzufügen.
Weitere Informationen zur Verwendung von Erweiterungen zum Speichern von Zustandsdaten finden Sie unter Erweiterbare Objekte.
Verfügt OperationContext über die folgenden Eigenschaften und Methoden.
Die Current -Eigenschaft gibt das Objekt zurück, das OperationContext den aktuellen Ausführungskontext darstellt.
Die ServiceSecurityContext -Eigenschaft gibt die Sicherheitsumgebung zurück, in der die -Methode ausgeführt wird.
Die EndpointDispatcher -Eigenschaft ruft das -Objekt des Vorgangs ab System.ServiceModel.Dispatcher.EndpointDispatcher.
Die Extensions -Eigenschaft gibt eine Erweiterungsauflistung für den aktuellen OperationContextzurück.
Die Host -Eigenschaft gibt das ServiceHostBase -Objekt zurück, das den Dienst verwaltet.
Die HasSupportingTokens -Eigenschaft gibt einen Wert zurück, der angibt, ob die Methode über unterstützende Token verfügt. Wenn ja, ruft die SupportingTokens -Eigenschaft diese ab.
Die IncomingMessageHeadersEigenschaften , IncomingMessagePropertiesund IncomingMessageVersion rufen diese Elemente aus der eingehenden Nachricht ab.
Das OperationCompleted Ereignis wird ausgelöst, wenn der Vorgang abgeschlossen ist.
Die OutgoingMessageHeaders Eigenschaften und OutgoingMessageProperties rufen diese Elemente für die ausgehende Nachricht ab.
Die RequestContext -Eigenschaft gibt die RequestContext Implementierung für die -Methode zurück.
Die InstanceContext -Eigenschaft gibt das zurück, das InstanceContext dem Vorgang zugeordnet ist.
Die SessionId -Eigenschaft gibt den Sitzungsbezeichner für den aktuellen Kanal und das aktuelle Objekt zurück.
Die GetCallbackChannel -Methode gibt im Fall der Duplexkommunikation einen Rückrufkanal an den Aufrufer zurück.
Die SetTransactionComplete -Methode committ die aktuelle Transaktion.
Konstruktoren
OperationContext(IContextChannel) |
Initialisiert eine neue Instanz der OperationContext-Klasse, die den angegebenen IContextChannel in einer Clientanwendung verwendet. |
Eigenschaften
Channel |
Ruft den dem aktuellen OperationContext-Objekt zugeordneten Kanal ab. |
ClaimsPrincipal |
Ruft den anspruchsbasierten Prinzipal ab, der dem Vorgang zugeordnet ist. |
Current |
Ruft den Ausführungskontext für den aktuellen Thread ab oder legt ihn fest. |
EndpointDispatcher |
Ruft ab oder legt den Endpunktverteiler für den zu prüfenden oder zu ändernden Endpunkt fest. |
Extensions |
Ruft die Diensterweiterungsauflistung vom aktuellen Nachrichtenkontext ab. |
HasSupportingTokens |
Ruft einen Wert ab, der angibt, ob die eingehende Nachrichte über unterstützende Tokens verfügt. |
Host |
Ruft ServiceHost für das aktuelle Dienstobjekt ab. |
IncomingMessageHeaders |
Ruft die eingehenden Nachrichtenheader für den OperationContext ab. |
IncomingMessageProperties |
Ruft die Nachrichteneigenschaften für die eingehende Nachricht im OperationContext ab. |
IncomingMessageVersion |
Ruft die eingehende SOAP-Nachrichtenversion für den OperationContext ab. |
InstanceContext |
Ruft das InstanceContext-Objekt ab, das die aktuelle Dienstinstanz verwaltet. |
IsUserContext |
Diese Eigenschaft ist zur Verwendung durch das System bestimmt und sollte nicht von Benutzern aufgerufen werden. |
OutgoingMessageHeaders |
Ruft die ausgehenden Nachrichtenheader für den aktiven OperationContext ab. |
OutgoingMessageProperties |
Ruft die Nachrichteneigenschaften für die ausgehende Nachricht im aktiven OperationContext ab. |
RequestContext |
Ruft die RequestContext-Implementierung für diese Methode ab oder legt sie fest. |
ServiceSecurityContext |
Ruft den ServiceSecurityContext ab, in dem Methode ausgeführt wird, oder legt ihn fest. |
SessionId |
Ruft die String ab, die zur Identifizierung der aktuellen Sitzung verwendet wird. |
SupportingTokens |
Ruft eine ICollection<T> des Typs SecurityToken ab. |
Methoden
Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetCallbackChannel<T>() |
Ruft einen Kanal zur Clientinstanz ab, die den aktuellen Vorgang aufgerufen hat. |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
SetTransactionComplete() |
Führt einen Commit für die aktuell ausführende Transaktion aus. |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
Ereignisse
OperationCompleted |
Tritt ein, wenn der Vorgang abgeschlossen wurde. |