Freigeben über


CallContext-Klasse

Stellt eine Gruppe von Eigenschaften bereit, die über den Codeausführungspfad weitergegeben werden. Diese Klasse kann nicht vererbt werden.

Namespace: System.Runtime.Remoting.Messaging
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public NotInheritable Class CallContext
'Usage
Dim instance As CallContext
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public sealed class CallContext
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public ref class CallContext sealed
/** @attribute SerializableAttribute() */ 
/** @attribute ComVisibleAttribute(true) */ 
public final class CallContext
SerializableAttribute 
ComVisibleAttribute(true) 
public final class CallContext

Hinweise

Der CallContext ist ein spezielles Auflistungsobjekt, das einem lokalen Threadspeicher für Methodenaufrufe ähnlich ist, und er stellt Datenslots bereit, die für jeden logischen Ausführungsthread eindeutig sind. Diese Slots werden nicht über Aufrufkontexte für andere logische Threads hinweg freigegeben. Dem CallContext können Objekte hinzugefügt werden, während dieser den Codeausführungspfad auf- und abwärts durchläuft und von verschiedenen Objekten auf dem Pfad überprüft wird.

Bei einem Remotemethodenaufruf eines Objekts in einer anderen AppDomain generiert die CallContext-Klasse eine LogicalCallContext-Instanz, die zusammen mit dem Remoteaufruf übermittelt wird. Außerhalb der AppDomain werden in einem LogicalCallContext nur Objekte verbreitet, die die ILogicalThreadAffinative-Schnittstelle verfügbar machen und im CallContext gespeichert sind. Objekte, die diese Schnittstelle nicht unterstützen, werden in LogicalCallContext-Instanzen mit Remotemethodenaufrufen nicht übertragen.

Hinweis

Sämtliche Methoden in CallContext sind statisch und werden für den Aufrufkontext im aktuellen Thread ausgeführt.

Hinweis

Diese Klasse führt einen Verknüpfungsaufruf aus. Eine SecurityException wird ausgelöst, wenn der direkte Aufrufer nicht über die Berechtigung für die Infrastruktur verfügt. Weitere Informationen finden Sie unter Verknüpfungsaufrufe.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie Principal- und Identitätsobjekte mithilfe der CallContext-Klasse für die Identifikation an einen Remotespeicherort übertragen werden. Den in diesem Beispiel für die LogicalCallContextData-Klasse verwendeten Code finden Sie im Beispiel für die ILogicalThreadAffinative-Schnittstelle. Den in diesem Beispiel für die HelloServiceClass-Klasse verwendeten Code finden Sie im Beispiel für die GetData-Methode. Den in diesem Beispiel für die Serverklasse verwendeten Code finden Sie im Beispiel für die RegisterActivatedServiceType-Klasse.

Imports System
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 'Main

End Class 'ClientClass
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 {
   [PermissionSet(SecurityAction.LinkDemand)]
   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);
   }
}
#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;
}

.NET Framework-Sicherheit

Vererbungshierarchie

System.Object
  System.Runtime.Remoting.Messaging.CallContext

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

CallContext-Member
System.Runtime.Remoting.Messaging-Namespace
Header