OperationContext Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Fornisce l'accesso al contesto di esecuzione di un metodo del servizio.
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
Esempio
Nell'esempio di codice seguente viene utilizzata la Current proprietà e GetCallbackChannel il metodo per ottenere di nuovo il canale al chiamante dall'interno di un metodo. Tutti i metodi in questo esempio sono metodi unidirezionale, consentendo al servizio e al client di comunicare in entrambe le direzioni in modo indipendente. In questo caso, l'applicazione client di esempio prevede una sola chiamata restituita prima che venga chiusa, ma un altro client, ad esempio un client Windows Form, può ricevere un numero qualsiasi di chiamate dal servizio.
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 per SampleDuplexHelloCallback ricevere il messaggio di callback. Il contratto di callback importato non corrisponde a quello del servizio, a causa dell'uso della Name proprietà nell'esempio precedente. Si noti che il client non presuppone se o quando potrebbe ricevere un callback; il callback del server è completamente indipendente dalla chiamata in uscita del client.
Annotazioni
Per un esempio che usa la OperationContext classe in uno scenario client, vedere 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
Usare l'oggetto OperationContext dall'interno di un'operazione del servizio per accedere all'ambiente di esecuzione dell'operazione corrente. In particolare, il contesto dell'operazione viene usato per accedere ai canali di callback nei servizi duplex, per archiviare dati di stato aggiuntivi tra parti delle operazioni e per accedere alle intestazioni e alle proprietà dei messaggi in ingresso, nonché aggiungere intestazioni e proprietà dei messaggi in uscita.
Per altre informazioni sull'uso delle estensioni per archiviare i dati sullo stato, vedere Extensible Objects.
ha OperationContext le proprietà e i metodi seguenti.
La Current proprietà restituisce l'oggetto OperationContext che rappresenta il contesto di esecuzione corrente.
La ServiceSecurityContext proprietà restituisce l'ambiente di sicurezza in cui viene eseguito il metodo .
La EndpointDispatcher proprietà ottiene l'oggetto dell'operazione System.ServiceModel.Dispatcher.EndpointDispatcher.
La Extensions proprietà restituisce un insieme di estensioni per l'oggetto corrente OperationContext.
La Host proprietà restituisce l'oggetto ServiceHostBase che gestisce il servizio.
La HasSupportingTokens proprietà restituisce un valore che indica se il metodo dispone di token di supporto, in caso affermativo, la SupportingTokens proprietà li ottiene.
Le IncomingMessageHeadersproprietà , IncomingMessagePropertiese IncomingMessageVersion ottengono questi elementi dal messaggio in arrivo.
L'evento OperationCompleted viene generato al termine dell'operazione.
Le OutgoingMessageHeaders proprietà e OutgoingMessageProperties ottengono questi elementi per il messaggio in uscita.
La RequestContext proprietà restituisce l'implementazione RequestContext per il metodo .
La InstanceContext proprietà restituisce l'oggetto InstanceContext associato all'operazione.
La SessionId proprietà restituisce l'identificatore di sessione per il canale e l'oggetto corrente.
Il GetCallbackChannel metodo restituisce un canale di callback al chiamante in caso di comunicazione duplex.
Il SetTransactionComplete metodo esegue il commit della transazione corrente.
Costruttori
| Nome | Descrizione |
|---|---|
| OperationContext(IContextChannel) |
Inizializza una nuova istanza della OperationContext classe che utilizza l'oggetto specificato IContextChannel in un'applicazione client. |
Proprietà
| Nome | Descrizione |
|---|---|
| Channel |
Ottiene il canale associato all'oggetto corrente OperationContext . |
| ClaimsPrincipal |
Ottiene l'entità basata sulle attestazioni associata all'operazione. |
| Current |
Ottiene o imposta il contesto di esecuzione per il thread corrente. |
| EndpointDispatcher |
Ottiene o imposta il dispatcher dell'endpoint per l'endpoint da controllare o modificare. |
| Extensions |
Ottiene la raccolta di estensioni del servizio dal contesto del messaggio corrente. |
| HasSupportingTokens |
Ottiene un valore che indica se il messaggio in ingresso dispone di token di supporto. |
| Host |
Ottiene l'oggetto ServiceHost per l'oggetto servizio corrente. |
| IncomingMessageHeaders |
Ottiene le intestazioni del messaggio in arrivo per l'oggetto OperationContext. |
| IncomingMessageProperties |
Ottiene le proprietà del messaggio per il messaggio in arrivo in OperationContext. |
| IncomingMessageVersion |
Ottiene la versione del messaggio SOAP in ingresso per .OperationContext |
| InstanceContext |
Ottiene l'oggetto InstanceContext che gestisce l'istanza del servizio corrente. |
| IsUserContext |
Questa proprietà è destinata all'uso del sistema e non deve essere chiamata dagli utenti. |
| OutgoingMessageHeaders |
Ottiene le intestazioni del messaggio in uscita per l'oggetto attivo OperationContext. |
| OutgoingMessageProperties |
Ottiene le proprietà del messaggio per il messaggio in uscita nell'oggetto attivo OperationContext. |
| RequestContext |
Ottiene o imposta l'implementazione RequestContext per questo metodo. |
| ServiceSecurityContext |
Ottiene o imposta l'oggetto all'interno del ServiceSecurityContext quale viene eseguito questo metodo. |
| SessionId |
Ottiene l'oggetto String utilizzato per identificare la sessione corrente. |
| SupportingTokens |
Ottiene un ICollection<T> oggetto di tipo SecurityToken. |
Metodi
| Nome | Descrizione |
|---|---|
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| GetCallbackChannel<T>() |
Ottiene un canale per l'istanza client che ha chiamato l'operazione corrente. |
| GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
| GetType() |
Ottiene il Type dell'istanza corrente. (Ereditato da Object) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| SetTransactionComplete() |
Esegue il commit della transazione attualmente in esecuzione. |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Eventi
| Nome | Descrizione |
|---|---|
| OperationCompleted |
Si verifica al termine dell'operazione. |