CallContext Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt eine Reihe von Eigenschaften bereit, die mit dem Ausführungscodepfad übertragen 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 zum Übertragen von Principal- und Identity Objects an einen Remotestandort zur Identifizierung veranschaulicht. Informationen zum Anzeigen des Codes für die LogicalCallContextData in diesem Beispiel verwendete Klasse finden Sie im Beispiel für die ILogicalThreadAffinative Schnittstelle. Informationen zum Anzeigen des Codes für die HelloServiceClass in diesem Beispiel verwendete Klasse finden Sie im Beispiel für die GetData Methode. Informationen zum Anzeigen des Codes 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 spezielles Auflistungsobjekt, das einem Thread local Storage für Methodenaufrufe ähnelt, und stellt Datenplätze bereit, die für jeden logischen Ausführungsthread eindeutig sind. Die Steckplätze werden nicht über Aufrufkontexte in anderen logischen Threads freigegeben. Objekte können dem CallContext Pfad hinzugefügt werden, während er nach unten wechselt und den Ausführungscodepfad zurückgibt und von verschiedenen Objekten entlang des Pfads untersucht wird.
Wenn ein Remotemethodenaufruf an ein Objekt in einer anderen AppDomainausgeführt wird, generiert die CallContext Klasse eine LogicalCallContext Instanz, die zusammen mit dem Remoteaufruf verläuft. Nur Objekte, die die ILogicalThreadAffinative Schnittstelle verfügbar machen und in der CallContext Datei gespeichert werden, werden außerhalb der AppDomain in einem LogicalCallContext. Objekte, die diese Schnittstelle nicht unterstützen, werden in LogicalCallContext Instanzen mit Remotemethodenaufrufen nicht übertragen.
Note
Alle methoden in CallContext are static and operate on the call context in the current Thread.
Note
Diese Klasse macht einen Linkbedarf. Ein SecurityException Fehler wird ausgelöst, wenn der direkte Aufrufer keine Infrastrukturberechtigung besitzt.
Eigenschaften
| Name | Beschreibung |
|---|---|
| HostContext |
Dient zum Abrufen oder Festlegen des Hostkontexts, der dem aktuellen Thread zugeordnet ist. |
Methoden
| Name | Beschreibung |
|---|---|
| Equals(Object) |
Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist. (Geerbt von Object) |
| FreeNamedDataSlot(String) |
Leert einen Datenplatz mit dem angegebenen Namen. |
| GetData(String) |
Ruft ein Objekt mit dem angegebenen Namen aus der CallContext. |
| GetHashCode() |
Dient als die Standard-Hashfunktion (Geerbt von Object) |
| GetHeaders() |
Gibt die Header zurück, die zusammen mit dem Methodenaufruf gesendet werden. |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| LogicalGetData(String) |
Ruft ein Objekt mit dem angegebenen Namen aus dem logischen Aufrufkontext ab. |
| LogicalSetData(String, Object) |
Speichert ein bestimmtes Objekt im logischen Aufrufkontext und ordnet es dem angegebenen Namen zu. |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| SetData(String, Object) |
Speichert ein bestimmtes Objekt und ordnet es dem 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) |