CallContext 类

定义

提供与执行代码路径一起传送的属性集。 此类不能被继承。

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
继承
CallContext
属性

示例

下面的代码示例演示如何使用 CallContext 类将 主体和标识对象 传输到远程位置进行标识。 若要查看此示例中使用的 类的代码 LogicalCallContextData ,请参阅 接口的示例 ILogicalThreadAffinative 。 若要查看此示例中使用的 类的代码 HelloServiceClass ,请参阅 方法的示例 GetData 。 若要查看此示例中使用的服务器类的代码,请参阅 该类的示例 RegisterActivatedServiceType

#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

注解

CallContext 是一个专用集合对象,类似于用于方法调用的线程本地存储,并提供每个执行逻辑线程唯一的数据槽。 这些槽不会在其他逻辑线程上的调用上下文之间共享。 对象可以在执行代码路径向下和备份时添加到 CallContext ,并由路径上的各种对象检查。

当对另 AppDomain一个 中的 对象进行远程方法调用时,类 CallContext 将生成一个 LogicalCallContext 实例,该实例与远程调用一起传输。 只有公开 ILogicalThreadAffinative 接口并存储在 中的 CallContext 对象才会在 中LogicalCallContext传播到 外部AppDomain。 不支持此接口的对象不会在具有远程方法调用的实例中 LogicalCallContext 传输。

注意

中的所有 CallContext 方法都是静态的,并且对当前 Thread中的调用上下文进行操作。

注意

此类提出链接需求。 SecurityException如果直接调用方没有基础结构权限,则会引发 。 有关详细信息 ,请参阅链接需求

属性

HostContext

获取或设置与当前线程相关联的主机上下文。

方法

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
FreeNamedDataSlot(String)

清空具有指定名称的数据槽。

GetData(String)

CallContext 中检索具有指定名称的对象。

GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetHeaders()

返回与方法调用一起发送的标题。

GetType()

获取当前实例的 Type

(继承自 Object)
LogicalGetData(String)

从逻辑调用上下文中检索具有指定名称的对象。

LogicalSetData(String, Object)

将一个给定对象存储在逻辑调用上下文中并将该对象与指定名称相关联。

MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
SetData(String, Object)

存储给定对象并将其与指定名称关联。

SetHeaders(Header[])

设置与方法调用一起发送的标题。

ToString()

返回表示当前对象的字符串。

(继承自 Object)

适用于

另请参阅