CallContext Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Proporciona un conjunto de propiedades que se incluyen con la ruta de acceso del código de ejecución. Esta clase no puede heredarse.
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
- Herencia
-
CallContext
- Atributos
Ejemplos
En el ejemplo de código siguiente se muestra el uso de la CallContext clase para transmitir objetos de entidad de seguridad e identidad a una ubicación remota para la identificación. Para ver el código de la LogicalCallContextData
clase usada en este ejemplo, vea el ejemplo de la ILogicalThreadAffinative interfaz . Para ver el código de la HelloServiceClass
clase usada en este ejemplo, vea el ejemplo del GetData método . Para ver el código de la clase de servidor usada en este ejemplo, vea el ejemplo de la RegisterActivatedServiceType clase .
#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
Comentarios
CallContext es un objeto de colección especializado similar a un almacenamiento local de subprocesos para llamadas de método y proporciona ranuras de datos únicas para cada subproceso lógico de ejecución. Las ranuras no se comparten entre contextos de llamada en otros subprocesos lógicos. Los objetos se pueden agregar a a CallContext medida que viaja hacia abajo y hace una copia de seguridad de la ruta de acceso del código de ejecución y se examinan por varios objetos a lo largo de la ruta de acceso.
Cuando se realiza una llamada de método remoto a un objeto en otro AppDomain, la CallContext clase genera una LogicalCallContext instancia que viaja junto con la llamada remota. Solo los objetos que exponen la ILogicalThreadAffinative interfaz y se almacenan en CallContext se propagan fuera de AppDomain en .LogicalCallContext Los objetos que no admiten esta interfaz no se transmiten en LogicalCallContext instancias con llamadas de método remoto.
Nota
Todos los métodos de CallContext son estáticos y operan en el contexto de llamada en el actual Thread.
Nota
Esta clase realiza una demanda de vínculo. Se produce una SecurityException
excepción si el llamador inmediato no tiene permiso de infraestructura. Consulte Peticiones de vínculo para obtener más información.
Propiedades
HostContext |
Obtiene o establece el contexto del host asociado al subproceso actual. |
Métodos
Equals(Object) |
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
FreeNamedDataSlot(String) |
Vacía una ranura de datos con el nombre especificado. |
GetData(String) |
Recupera un objeto con el nombre especificado de CallContext. |
GetHashCode() |
Sirve como la función hash predeterminada. (Heredado de Object) |
GetHeaders() |
Devuelve los encabezados que se envían junto con la llamada al método. |
GetType() |
Obtiene el Type de la instancia actual. (Heredado de Object) |
LogicalGetData(String) |
Recupera un objeto con el nombre especificado del contexto de llamada lógico. |
LogicalSetData(String, Object) |
Almacena un objeto determinado en el contexto de llamada lógico y lo asocia al nombre especificado. |
MemberwiseClone() |
Crea una copia superficial del Object actual. (Heredado de Object) |
SetData(String, Object) |
Almacena un objeto dado y lo asocia al nombre especificado. |
SetHeaders(Header[]) |
Establece los encabezados que se envían junto con la llamada al método. |
ToString() |
Devuelve una cadena que representa el objeto actual. (Heredado de Object) |