OperationContextScope Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Cria um bloco dentro do qual um OperationContext objeto está dentro do âmbito.
public ref class OperationContextScope sealed : IDisposable
public sealed class OperationContextScope : IDisposable
type OperationContextScope = class
interface IDisposable
Public NotInheritable Class OperationContextScope
Implements IDisposable
- Herança
-
OperationContextScope
- Implementações
Exemplos
O exemplo seguinte mostra como usar o OperationContextScope para criar um novo contexto numa aplicação cliente para adicionar um cabeçalho personalizado à mensagem de saída.
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
Observações
Use a OperationContextScope classe para criar um escopo para um objeto específico OperationContext ou um escopo para um novo OperationContext objeto usando um objeto especificado IContextChannel . Um OperationContextScope pode ser usado num serviço Windows Communication Foundation (WCF) ou numa aplicação cliente WCF.
Depois de o OperationContextScope objeto estabelecer o contexto operacional atual, pode usar o OperationContext para:
Aceder e modificar cabeçalhos de mensagens de entrada e saída e outras propriedades.
Aceda ao tempo de execução, incluindo os despachantes, o anfitrião, o canal e as extensões.
Aceda a outros tipos de contextos, como contextos de segurança, instância e pedido.
Aceda ao canal associado ao OperationContext objeto ou (se o canal implementar System.ServiceModel.Channels.ISession) ao identificador de sessão do canal associado.
Quando um OperationContextScope é criado, o atual OperationContext é armazenado e o novo OperationContext torna-se aquele devolvido pela Current propriedade. Quando é OperationContextScope descartado, o original OperationContext é restaurado.
Warning
Não utilize o padrão assíncrono "await" dentro de um bloco OperationContextScope. Quando a continuação ocorre, pode correr numa thread diferente e o OperationContextScope é específico da thread. Se precisares de chamar "await" para uma chamada assíncrona, usa-a fora do bloco OperationContextScope.
Construtores
| Name | Description |
|---|---|
| OperationContextScope(IContextChannel) |
Inicializa uma nova instância da OperationContextScope classe que usa o especificado IContextChannel para criar uma nova OperationContext para o escopo. |
| OperationContextScope(OperationContext) |
Inicializa uma nova instância da OperationContextScope classe para criar um escopo para o objeto especificado OperationContext . |
Métodos
| Name | Description |
|---|---|
| Dispose() |
Restaura o original OperationContext ao contexto ativo e recicla o OperationContextScope objeto. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |