Freigeben über


CallContext Klasse

Definition

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

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
Vererbung
CallContext
Attribute

Beispiele

Im folgenden Codebeispiel wird die Verwendung der CallContext -Klasse veranschaulicht, um Prinzipal- und Identitätsobjekte zur Identifizierung an einen Remotespeicherort zu übertragen. Informationen zum Anzeigen des Codes für die klasse, die LogicalCallContextData in diesem Beispiel verwendet wird, finden Sie im Beispiel für die ILogicalThreadAffinative -Schnittstelle. Informationen zum Anzeigen des Codes für die klasse, die HelloServiceClass in diesem Beispiel verwendet wird, finden Sie im Beispiel für die GetData -Methode. Den Code für die in diesem Beispiel verwendete Serverklasse finden Sie im Beispiel für die RegisterActivatedServiceType -Klasse.

#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

Hinweise

CallContext ist ein spezialisiertes Sammlungsobjekt, das einem lokalen Threadspeicher für Methodenaufrufe ähnelt, und stellt Datenslots bereit, die für jeden logischen Ausführungsthread eindeutig sind. Die Slots werden nicht über Aufrufkontexte in anderen logischen Threads gemeinsam genutzt. Objekte können hinzugefügt werden, CallContext während sie den Ausführungscodepfad nach unten und nach oben bewegt, und von verschiedenen Objekten entlang des Pfads untersucht werden.

Wenn ein Remotemethodenaufruf an ein Objekt in einem anderen AppDomainausgeführt wird, generiert die CallContext -Klasse eine LogicalCallContext instance, die zusammen mit dem Remoteaufruf verläuft. Nur Objekte, die die ILogicalThreadAffinative -Schnittstelle verfügbar machen und in der CallContext gespeichert werden, werden außerhalb von AppDomain in weitergegeben LogicalCallContext. Objekte, die diese Schnittstelle nicht unterstützen, werden in LogicalCallContext Instanzen nicht mit Remotemethodenaufrufen übertragen.

Hinweis

Alle Methoden in CallContext sind statisch und arbeiten mit dem Aufrufkontext im aktuellen Thread.

Hinweis

Diese Klasse stellt eine Linkanforderung. Ein SecurityException wird ausgelöst, wenn der unmittelbare Aufrufer nicht über die Infrastrukturberechtigung verfügt. Weitere Informationen finden Sie unter Linkanforderungen .

Eigenschaften

HostContext

Ruft den dem aktuellen Thread zugeordneten Hostkontext ab oder legt diesen fest.

Methoden

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
FreeNamedDataSlot(String)

Leert einen Datenslot mit dem angegebenen Namen.

GetData(String)

Ruft ein Objekt mit dem angegebenen Namen aus CallContext ab.

GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetHeaders()

Gibt die Header zurück, die zusammen mit dem Methodenaufruf gesendet werden.

GetType()

Ruft den Type der aktuellen Instanz ab.

(Geerbt von Object)
LogicalGetData(String)

Ruft ein Objekt mit dem angegebenen Namen vom logischen Aufrufkontext ab.

LogicalSetData(String, Object)

Speichert ein angegebenes Objekt im logischen Aufrufkontext und ordnet es dem angegebenen Namen zu.

MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
SetData(String, Object)

Speichert ein bestimmtes Objekt und ordnet diesem den angegebenen Namen zu.

SetHeaders(Header[])

Legt die Header fest, die zusammen mit dem Methodenaufruf gesendet werden.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für:

Weitere Informationen