CallContext 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供一组随执行代码路径一起携带的属性。 无法继承此类。
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 传输。
Note
所有方法都是静态的 CallContext ,并且对当前 Thread调用上下文进行操作。
Note
此类需要链接。 如果即时调用方没有基础结构权限,则会引发 A SecurityException 。
属性
| 名称 | 说明 |
|---|---|
| HostContext |
获取或设置与当前线程关联的主机上下文。 |
方法
| 名称 | 说明 |
|---|---|
| Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
| FreeNamedDataSlot(String) |
用指定名称清空数据槽。 |
| GetData(String) |
从 < |
| GetHashCode() |
用作默认哈希函数。 (继承自 Object) |
| GetHeaders() |
返回随方法调用一起发送的标头。 |
| GetType() |
获取当前实例的 Type。 (继承自 Object) |
| LogicalGetData(String) |
从逻辑调用上下文中检索具有指定名称的对象。 |
| LogicalSetData(String, Object) |
将给定对象存储在逻辑调用上下文中,并将其与指定名称相关联。 |
| MemberwiseClone() |
创建当前 Object的浅表副本。 (继承自 Object) |
| SetData(String, Object) |
存储给定对象并将其与指定名称相关联。 |
| SetHeaders(Header[]) |
设置随方法调用一起发送的标头。 |
| ToString() |
返回一个表示当前对象的字符串。 (继承自 Object) |