OperationContext Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zapewnia dostęp do kontekstu wykonywania metody usługi.
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)
- Dziedziczenie
-
OperationContext
- Implementuje
Przykłady
Poniższy przykład kodu używa Current właściwości i GetCallbackChannel metody w celu uzyskania kanału z powrotem do obiektu wywołującego z poziomu metody. Wszystkie metody w tym przykładzie to metody jednokierunkowe, umożliwiając usłudze i klientowi niezależne komunikowanie się w obu kierunkach. W takim przypadku przykładowa aplikacja kliencka oczekuje tylko jednego wywołania zwrotnego przed jego zamknięciem, ale inny klient, na przykład klient Windows Forms, może odbierać dowolną liczbę wywołań z usługi.
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
Następujący klient implementuje element SampleDuplexHelloCallback
w celu odebrania komunikatu wywołania zwrotnego. Importowany kontrakt wywołania zwrotnego nie jest taką samą nazwą jak ten w usłudze, ze względu na użycie Name właściwości w poprzednim przykładzie. Należy pamiętać, że klient nie przyjmuje żadnych założeń dotyczących tego, czy lub kiedy może otrzymać wywołanie zwrotne; wywołanie zwrotne serwera jest całkowicie niezależne od wywołania wychodzącego klienta.
Uwaga
Przykład użycia klasy w scenariuszu OperationContext klienta można znaleźć w temacie 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
Uwagi
OperationContext Użyj polecenia z poziomu operacji usługi, aby uzyskać dostęp do bieżącego środowiska wykonywania operacji. W szczególności kontekst operacji służy do uzyskiwania dostępu do kanałów wywołania zwrotnego w usługach dwukierunkowych, przechowywania dodatkowych danych stanu w częściach operacji oraz uzyskiwania dostępu do przychodzących nagłówków i właściwości komunikatów, a także dodawania nagłówków i właściwości wychodzących komunikatów.
Aby uzyskać więcej informacji na temat używania rozszerzeń do przechowywania danych stanu, zobacz Extensible Objects (Rozszerzalne obiekty).
Element OperationContext ma następujące właściwości i metody.
Właściwość Current zwraca OperationContext obiekt reprezentujący bieżący kontekst wykonywania.
Właściwość ServiceSecurityContext zwraca środowisko zabezpieczeń, w którym jest wykonywana metoda.
Właściwość EndpointDispatcher pobiera operację System.ServiceModel.Dispatcher.EndpointDispatcher.
Właściwość Extensions zwraca kolekcję rozszerzeń dla bieżącego OperationContextelementu .
Właściwość Host zwraca ServiceHostBase obiekt, który zarządza usługą.
Właściwość HasSupportingTokens zwraca wartość wskazującą, czy metoda ma tokeny pomocnicze, jeśli tak, SupportingTokens właściwość je pobiera.
Właściwości IncomingMessageHeaders, IncomingMessagePropertiesi IncomingMessageVersion pobierają te elementy z komunikatu przychodzącego.
Zdarzenie OperationCompleted jest uruchamiane po zakończeniu operacji.
Właściwości OutgoingMessageHeaders i OutgoingMessageProperties pobierają te elementy dla komunikatu wychodzącego.
Właściwość RequestContext zwraca implementację RequestContext metody .
Właściwość InstanceContext zwraca InstanceContext wartość skojarzona z operacją.
Właściwość SessionId zwraca identyfikator sesji dla bieżącego kanału i obiektu.
Metoda GetCallbackChannel zwraca kanał wywołania zwrotnego do obiektu wywołującego w przypadku komunikacji dwustronnej.
Metoda SetTransactionComplete zatwierdza bieżącą transakcję.
Konstruktory
OperationContext(IContextChannel) |
Inicjuje OperationContext nowe wystąpienie klasy, która używa klasy określonej IContextChannel w aplikacji klienckiej. |
Właściwości
Channel |
Pobiera kanał skojarzony z bieżącym OperationContext obiektem. |
ClaimsPrincipal |
Pobiera podmiot zabezpieczeń oparty na oświadczeniach skojarzony z operacją. |
Current |
Pobiera lub ustawia kontekst wykonywania dla bieżącego wątku. |
EndpointDispatcher |
Pobiera lub ustawia dyspozytor punktu końcowego dla punktu końcowego w celu sprawdzenia lub zmodyfikowania. |
Extensions |
Pobiera kolekcję rozszerzeń usługi z bieżącego kontekstu komunikatu. |
HasSupportingTokens |
Pobiera wartość wskazującą, czy komunikat przychodzący ma tokeny pomocnicze. |
Host |
Pobiera element ServiceHost dla bieżącego obiektu usługi. |
IncomingMessageHeaders |
Pobiera nagłówki komunikatów przychodzących dla .OperationContext |
IncomingMessageProperties |
Pobiera właściwości komunikatu dla komunikatu przychodzącego w obiekcie OperationContext. |
IncomingMessageVersion |
Pobiera przychodzącą wersję komunikatu PROTOKOŁU SOAP dla programu OperationContext. |
InstanceContext |
InstanceContext Pobiera obiekt, który zarządza bieżącym wystąpieniem usługi. |
IsUserContext |
Ta właściwość jest przeznaczona do użycia systemu i nie powinna być wywoływana przez użytkowników. |
OutgoingMessageHeaders |
Pobiera nagłówki komunikatów wychodzących dla aktywnego OperationContextpliku . |
OutgoingMessageProperties |
Pobiera właściwości komunikatu dla komunikatu wychodzącego w aktywnym OperationContextobiekcie . |
RequestContext |
Pobiera lub ustawia implementację RequestContext dla tej metody. |
ServiceSecurityContext |
Pobiera lub ustawia ServiceSecurityContext element, w którym jest wykonywana ta metoda. |
SessionId |
Pobiera element String używany do identyfikowania bieżącej sesji. |
SupportingTokens |
Pobiera typ ICollection<T>SecurityToken. |
Metody
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetCallbackChannel<T>() |
Pobiera kanał do wystąpienia klienta, który nazwał bieżącą operację. |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
SetTransactionComplete() |
Zatwierdza aktualnie wykonującą transakcję. |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Zdarzenia
OperationCompleted |
Występuje po zakończeniu operacji. |