OperationContextScope 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.
Crea un blocco all'interno del quale un OperationContext oggetto si trova nell'ambito.
public ref class OperationContextScope sealed : IDisposable
public sealed class OperationContextScope : IDisposable
type OperationContextScope = class
interface IDisposable
Public NotInheritable Class OperationContextScope
Implements IDisposable
- Ereditarietà
-
OperationContextScope
- Implementazioni
Esempio
Nell'esempio seguente viene illustrato come usare OperationContextScope per creare un nuovo contesto in un'applicazione client per aggiungere un'intestazione personalizzata al messaggio in uscita.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Threading;
public class Client : ISampleServiceCallback
{
ManualResetEvent wait = null;
Client()
{
this.wait = new ManualResetEvent(false);
}
public static void Main()
{
Client client = new Client();
client.Run();
}
void Run()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient(new InstanceContext(this));
try
{
using (OperationContextScope scope = new OperationContextScope(wcfClient.InnerChannel))
{
MessageHeader header
= MessageHeader.CreateHeader(
"Service-Bound-CustomHeader",
"http://Microsoft.WCF.Documentation",
"Custom Happy Value."
);
OperationContext.Current.OutgoingMessageHeaders.Add(header);
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
//Console.ReadLine();
header = MessageHeader.CreateHeader(
"Service-Bound-OneWayHeader",
"http://Microsoft.WCF.Documentation",
"Different Happy Value."
);
OperationContext.Current.OutgoingMessageHeaders.Add(header);
// One-way
wcfClient.Push(greeting);
this.wait.WaitOne();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
Console.ReadLine();
}
}
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();
}
}
#region ISampleServiceCallback Members
public void PushBack(string msg)
{
Console.WriteLine("Service said: " + msg);
this.WriteHeaders(OperationContext.Current.IncomingMessageHeaders);
this.wait.Set();
}
void WriteHeaders(MessageHeaders headers)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("IncomingHeader:");
Console.ForegroundColor = ConsoleColor.Blue;
foreach (MessageHeaderInfo h in headers)
{
if (!h.Actor.Equals(String.Empty))
Console.WriteLine("\t" + h.Actor);
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("\t" + h.Name);
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("\t" + h.Namespace);
Console.WriteLine("\t" + h.Relay);
if (h.IsReferenceParameter)
{
Console.WriteLine("IsReferenceParameter header detected: " + h.ToString());
}
}
Console.ResetColor();
}
#endregion
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports System.Threading
Public Class Client
Implements ISampleServiceCallback
Private wait As ManualResetEvent = Nothing
Private Sub New()
Me.wait = New ManualResetEvent(False)
End Sub
Public Shared Sub Main()
Dim client As New Client()
client.Run()
End Sub
Private Sub Run()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient(New InstanceContext(Me))
Try
Using scope As New OperationContextScope(wcfClient.InnerChannel)
Dim header As MessageHeader = MessageHeader.CreateHeader("Service-Bound-CustomHeader", _
"http://Microsoft.WCF.Documentation", "Custom Happy Value.")
OperationContext.Current.OutgoingMessageHeaders.Add(header)
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting As String = Console.ReadLine()
'Console.ReadLine();
header = MessageHeader.CreateHeader("Service-Bound-OneWayHeader", _
"http://Microsoft.WCF.Documentation", "Different Happy Value.")
OperationContext.Current.OutgoingMessageHeaders.Add(header)
' One-way
wcfClient.Push(greeting)
Me.wait.WaitOne()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Console.ReadLine()
End Using
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
#Region "ISampleServiceCallback Members"
Public Sub PushBack(ByVal msg As String) Implements ISampleServiceCallback.PushBack
Console.WriteLine("Service said: " & msg)
Me.WriteHeaders(OperationContext.Current.IncomingMessageHeaders)
Me.wait.Set()
End Sub
Private Sub WriteHeaders(ByVal headers As MessageHeaders)
Console.ForegroundColor = ConsoleColor.Red
Console.WriteLine("IncomingHeader:")
Console.ForegroundColor = ConsoleColor.Blue
For Each h As MessageHeaderInfo In headers
If Not h.Actor.Equals(String.Empty) Then
Console.WriteLine(vbTab & h.Actor)
End If
Console.ForegroundColor = ConsoleColor.White
Console.WriteLine(vbTab & h.Name)
Console.ForegroundColor = ConsoleColor.Blue
Console.WriteLine(vbTab & h.Namespace)
Console.WriteLine(vbTab & h.Relay)
If h.IsReferenceParameter = True Then
Console.WriteLine("IsReferenceParameter header detected: " & h.ToString())
End If
Next h
Console.ResetColor()
End Sub
#End Region
End Class
Commenti
Utilizzare la OperationContextScope classe per creare un ambito per un oggetto specifico OperationContext o un ambito per un nuovo OperationContext oggetto usando un oggetto specificato IContextChannel . Un OperationContextScope oggetto può essere usato in un servizio Windows Communication Foundation (WCF) o in un'applicazione client WCF.
Dopo che l'oggetto OperationContextScope ha stabilito il contesto dell'operazione corrente, è possibile usare per OperationContext :
Accedere e modificare le intestazioni dei messaggi in ingresso e in uscita e altre proprietà.
Accedere al runtime, inclusi dispatcher, host, canale ed estensioni.
Accedere ad altri tipi di contesti, ad esempio sicurezza, istanza e contesti di richiesta.
Accedere al canale associato all'oggetto OperationContext o ( se il canale implementa System.ServiceModel.Channels.ISession) l'identificatore di sessione del canale associato.
Quando viene creato un oggetto OperationContextScope , l'oggetto corrente OperationContext viene archiviato e il nuovo OperationContext diventa quello restituito dalla Current proprietà . Quando l'oggetto OperationContextScope viene eliminato, l'originale OperationContext viene ripristinato.
Avviso
Non usare il modello asincrono "await" all'interno di un blocco OperationContextScope. Quando si verifica la continuazione, può essere eseguita in un thread diverso e OperationContextScope è specifico del thread. Se è necessario chiamare "await" per una chiamata asincrona, usarlo all'esterno del blocco OperationContextScope.
Costruttori
| Nome | Descrizione |
|---|---|
| OperationContextScope(IContextChannel) |
Inizializza una nuova istanza della OperationContextScope classe che utilizza l'oggetto specificato IContextChannel per creare un nuovo OperationContext oggetto per l'ambito. |
| OperationContextScope(OperationContext) |
Inizializza una nuova istanza della OperationContextScope classe per creare un ambito per l'oggetto specificato OperationContext . |
Metodi
| Nome | Descrizione |
|---|---|
| Dispose() |
Ripristina l'originale OperationContext nel contesto attivo e ricicla l'oggetto OperationContextScope . |
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| 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) |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |