Remoting CallContext 实现客户端识别

本文介绍了一种在Remoting项目中通过CallContext传递客户端标识的方法。通过在客户端设置Identity对象,并利用CallContext将其发送到服务端,在服务端可以通过CallContext获取到客户端的标识,从而实现了客户端身份的识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近整理一个Remoting项目, 需要识别客户端。最先想到的是WCF的MessageHeader,WebService的SoapHeader,抑或是通过消息拦截能够加入额外的信息。 调查了下发现 Remoting 实现消息拦截还比较麻烦(需要实现RealProxy等,详细看这里:http://www.cnblogs.com/idior/articles/872380.html)。 好在 Remoting 里还有个东东叫 CallContext 的东东可以封送额外的信息,调用上下文在应用程序域边界被克隆,其数据槽不在其他逻辑线程上的调用上下文之间共享。 当然放入 CallContext 的数据需要实现 ILogicalThreadAffinative 接口。

Identity.cs
using System; using System.Runtime.Remoting.Messaging; namespace RemotingCommLib { [Serializable] public class Identity : ILogicalThreadAffinative { // 客户端标识 public string ClientID { get; set; } public string ExtensionData { get; set; } } }

服务端实现
using System; using RemotingCommLib; using System.Runtime.Remoting.Messaging; namespace RemotingServiceHost { public class Service : MarshalByRefObject, IService { public string GetServerTime() { Identity identity = CallContext.GetData("identity") as Identity; Console.WriteLine("Client[{0}] access.", identity.ClientID); return string.Format("Get message from server at {0:HH:mm:ss}", DateTime.Now); } } }

客户端调用
using System; using System.Runtime.Remoting; using RemotingCommLib; using System.Runtime.Remoting.Messaging; using System.Threading; namespace RemotingClient { class Program { static void Main(string[] args) { string config = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; RemotingConfiguration.Configure(config, false); string url = RemotingConfiguration.GetRegisteredWellKnownClientTypes()[0].ObjectUrl; IService client = (IService)Activator.GetObject(typeof(IService), url); Identity identity = new Identity(); identity.ClientID = Guid.NewGuid().ToString(); CallContext.SetData("identity", identity); string reply = client.GetServerTime(); Console.WriteLine("Client {0}:{1}", identity.ClientID, reply); Thread.Sleep(1000); IService client1 = (IService)Activator.GetObject(typeof(IService), url); string reply1 = client1.GetServerTime(); Console.WriteLine("Client {0}:{1}", identity.ClientID, reply1); Console.Read(); } } }

启动两个客户端调用:


服务端通过 CallContext.GetData 取到了客户端的标识ID。通过这种方法,还可以实现用户名密码的验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值