CallContext 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.
Fornece um conjunto de propriedades que são transportadas com o caminho do código de execução. Esta classe não pode ser herdada.
public ref class CallContext sealed
[System.Serializable]
public sealed class CallContext
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class CallContext
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Security.SecurityCritical]
public sealed class CallContext
[<System.Serializable>]
type CallContext = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type CallContext = class
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Security.SecurityCritical>]
type CallContext = class
Public NotInheritable Class CallContext
- Herança
-
CallContext
- Atributos
Exemplos
O exemplo de código seguinte demonstra o uso da CallContext classe para transmitir Objetos Principal e Identidade para uma localização remota para identificação. Para visualizar o código da LogicalCallContextData classe usada neste exemplo, veja o exemplo da ILogicalThreadAffinative interface. Para visualizar o código da HelloServiceClass classe usada neste exemplo, veja o exemplo do GetData método. Para ver o código da classe servidor usada neste exemplo, veja o exemplo da RegisterActivatedServiceType classe.
#using <system.dll>
#using <system.runtime.remoting.dll>
#using <service.dll>
using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Tcp;
using namespace System::Runtime::Remoting::Messaging;
using namespace System::Security::Principal;
int main()
{
GenericIdentity^ ident = gcnew GenericIdentity( "Bob" );
array<String^>^id = gcnew array<String^>(1);
id[ 0 ] = "Level1";
GenericPrincipal^ prpal = gcnew GenericPrincipal( ident,id );
LogicalCallContextData ^ data = gcnew LogicalCallContextData( prpal );
//Enter data into the CallContext
CallContext::SetData( "test data", data );
Console::WriteLine( data->numOfAccesses );
ChannelServices::RegisterChannel( gcnew TcpChannel );
RemotingConfiguration::RegisterActivatedClientType( HelloServiceClass::typeid, "tcp://localhost:8082" );
HelloServiceClass ^ service = gcnew HelloServiceClass;
if ( service == nullptr )
{
Console::WriteLine( "Could not locate server." );
return 0;
}
// call remote method
Console::WriteLine();
Console::WriteLine( "Calling remote Object*" );
Console::WriteLine( service->HelloMethod( "Caveman" ) );
Console::WriteLine( service->HelloMethod( "Spaceman" ) );
Console::WriteLine( service->HelloMethod( "Bob" ) );
Console::WriteLine( "Finished remote Object* call" );
Console::WriteLine();
//Extract the returned data from the call context
LogicalCallContextData ^ returnedData = static_cast<LogicalCallContextData ^>(CallContext::GetData( "test data" ));
Console::WriteLine( data->numOfAccesses );
Console::WriteLine( returnedData->numOfAccesses );
return 0;
}
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Messaging;
using System.Security.Principal;
using System.Security.Permissions;
public class ClientClass {
public static void Main() {
GenericIdentity ident = new GenericIdentity("Bob");
GenericPrincipal prpal = new GenericPrincipal(ident,
new string[] {"Level1"});
LogicalCallContextData data = new LogicalCallContextData(prpal);
//Enter data into the CallContext
CallContext.SetData("test data", data);
Console.WriteLine(data.numOfAccesses);
ChannelServices.RegisterChannel(new TcpChannel());
RemotingConfiguration.RegisterActivatedClientType(typeof(HelloServiceClass),
"tcp://localhost:8082");
HelloServiceClass service = new HelloServiceClass();
if(service == null) {
Console.WriteLine("Could not locate server.");
return;
}
// call remote method
Console.WriteLine();
Console.WriteLine("Calling remote object");
Console.WriteLine(service.HelloMethod("Caveman"));
Console.WriteLine(service.HelloMethod("Spaceman"));
Console.WriteLine(service.HelloMethod("Bob"));
Console.WriteLine("Finished remote object call");
Console.WriteLine();
//Extract the returned data from the call context
LogicalCallContextData returnedData =
(LogicalCallContextData)CallContext.GetData("test data");
Console.WriteLine(data.numOfAccesses);
Console.WriteLine(returnedData.numOfAccesses);
}
}
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Messaging
Imports System.Security.Principal
Imports System.Security.Permissions
Public Class ClientClass
<PermissionSet(SecurityAction.LinkDemand)> _
Public Shared Sub Main()
Dim ident As New GenericIdentity("Bob")
Dim prpal As New GenericPrincipal(ident, New String() {"Level1"})
Dim data As New LogicalCallContextData(prpal)
'Enter data into the CallContext
CallContext.SetData("test data", data)
Console.WriteLine(data.numOfAccesses)
ChannelServices.RegisterChannel(New TcpChannel())
RemotingConfiguration.RegisterActivatedClientType(GetType(HelloServiceClass), "tcp://localhost:8082")
Dim service As New HelloServiceClass()
If service Is Nothing Then
Console.WriteLine("Could not locate server.")
Return
End If
' call remote method
Console.WriteLine()
Console.WriteLine("Calling remote object")
Console.WriteLine(service.HelloMethod("Caveman"))
Console.WriteLine(service.HelloMethod("Spaceman"))
Console.WriteLine(service.HelloMethod("Bob"))
Console.WriteLine("Finished remote object call")
Console.WriteLine()
'Extract the returned data from the call context
Dim returnedData As LogicalCallContextData = CType(CallContext.GetData("test data"), LogicalCallContextData)
Console.WriteLine(data.numOfAccesses)
Console.WriteLine(returnedData.numOfAccesses)
End Sub
End Class
Observações
CallContext é um objeto de coleção especializado semelhante a um Thread Local Storage para chamadas de método e fornece espaços de dados únicos para cada thread lógico de execução. Os slots não são partilhados entre contextos de chamada noutros threads lógicos. Os objetos podem ser adicionados à CallContext medida que desce e voltam a subir o caminho do código de execução, e examinados por vários objetos ao longo do caminho.
Quando uma chamada remota de método é feita a um objeto noutro AppDomain, a CallContext classe gera uma LogicalCallContext instância que viaja juntamente com a chamada remota. Apenas os objetos que expõem a ILogicalThreadAffinative interface e são armazenados em o CallContext são propagados fora do AppDomain em um LogicalCallContext. Objetos que não suportam esta interface não são transmitidos em LogicalCallContext instâncias com chamadas de método remotas.
Note
Todos os métodos em CallContext são estáticos e operam no contexto de chamada na corrente Thread.
Note
Esta aula exige uma ligação. A é lançado se o chamador imediato não tiver autorização de SecurityException infraestrutura. Consulte o link Exigências para mais informações.
Propriedades
| Name | Description |
|---|---|
| HostContext |
Obtém ou define o contexto anfitrião associado à thread atual. |
Métodos
| Name | Description |
|---|---|
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| FreeNamedDataSlot(String) |
Esvazia um slot de dados com o nome especificado. |
| GetData(String) |
Recupera um objeto com o nome especificado a partir do CallContext. |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetHeaders() |
Devolve os cabeçalhos enviados juntamente com a chamada ao método. |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| LogicalGetData(String) |
Recupera um objeto com o nome especificado do contexto de chamada lógica. |
| LogicalSetData(String, Object) |
Armazena um dado objeto no contexto da chamada lógica e associa-o ao nome especificado. |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| SetData(String, Object) |
Armazena um dado objeto e associa-o ao nome especificado. |
| SetHeaders(Header[]) |
Define os cabeçalhos que são enviados juntamente com a chamada de método. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |