OperationContextScope Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Crée un bloc à l'intérieur duquel un objet OperationContext est dans la portée.
public ref class OperationContextScope sealed : IDisposable
public sealed class OperationContextScope : IDisposable
type OperationContextScope = class
interface IDisposable
Public NotInheritable Class OperationContextScope
Implements IDisposable
- Héritage
-
OperationContextScope
- Implémente
Exemples
L'exemple suivant indique comment utiliser la OperationContextScope pour créer un contexte dans une application cliente afin d'ajouter un en-tête personnalisé au message sortant.
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 == true)
{
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
Remarques
Utilisez la classe OperationContextScope pour créer une portée pour un objet OperationContext spécifique ou pour un nouvel objet OperationContext à l'aide d'un objet IContextChannel spécifié. Un OperationContextScope peut être utilisé dans un service Windows Communication Foundation (WCF) ou une application cliente WCF.
Une fois que l'objet OperationContextScope a établi le contexte d'opération actuel, vous pouvez utiliser le OperationContext pour :
Accéder aux en-têtes et à d'autres propriétés des messages entrants et sortants et les modifier.
Accéder à l’exécution, y compris aux répartiteurs, à l’hôte, au canal et aux extensions.
Accéder à d'autres types de contextes, tels que les contextes de sécurité, d'instance et de demande.
Accéder au canal associé à l'objet OperationContext ou (si le canal implémente System.ServiceModel.Channels.ISession) à l'identificateur de session du canal associé.
Lorsqu'une OperationContextScope est créée, le OperationContext actuel est stocké et le nouveau OperationContext est celui retourné par la propriété Current. Lorsque la OperationContextScope est supprimée, le OperationContext d'origine est restauré.
Avertissement
N’utilisez pas le modèle asynchrone « await » dans un bloc OperationContextScope. Lorsque la continuation se produit, elle peut s’exécuter sur un thread différent et OperationContextScope est spécifique au thread. Si vous devez appeler « await » pour un appel asynchrone, utilisez-le en dehors du bloc OperationContextScope.
Constructeurs
OperationContextScope(IContextChannel) |
Initialise une nouvelle instance de la classe OperationContextScope qui utilise le IContextChannel spécifié pour créer un OperationContext pour la portée. |
OperationContextScope(OperationContext) |
Initialise une nouvelle instance de la classe OperationContextScope pour créer une portée pour l'objet OperationContext spécifié. |
Méthodes
Dispose() |
Rétablit le OperationContext d'origine comme contexte actif et recycle l'objet OperationContextScope. |
Equals(Object) |
Détermine si l'objet spécifié est égal à l'objet actuel. (Hérité de Object) |
GetHashCode() |
Fait office de fonction de hachage par défaut. (Hérité de Object) |
GetType() |
Obtient le Type de l'instance actuelle. (Hérité de Object) |
MemberwiseClone() |
Crée une copie superficielle du Object actuel. (Hérité de Object) |
ToString() |
Retourne une chaîne qui représente l'objet actuel. (Hérité de Object) |