分布式系统中客户端与服务器通讯时需要每次携带一此附属信息,比如:语种(支持多国语言系统),数据库连接字符串(支持多账套系统),客户端IP等。在每个应用服务的接口中增加一个这种附属参数对象在大型系统中是不现实的。.Net Remoting中的System.Runtime.Remoting.Messaging.ILogicalThreadAffinative 为我们解决了上面的困难,当然也要可以通过自定义Sink来达到效果,但需要多写很多代码,且要熟悉增加自定义Sink的功能。先从简单的学起吧。
在Common.dll中我们定义一个附属信息的实体,为了演示我们只为它加了一个属性。最重要的是实现了System.Runtime.Remoting.Messaging.ILogicalThreadAffinative接口,该接口是一个空接口,没有行为。
[Serializable]
public class ContentData : System.Runtime.Remoting.Messaging.ILogicalThreadAffinative
{
private string ip;
public ContentData(string ip)
{
this.ip = ip;
}
public string IP
{
get
{
return ip;
}
}
}
在客户端
class Client
{
static void Main(string[] args)
{
string ip = "192.168.1.1"; //每个 客户端不一样
ContentData data = new ContentData(ip);
System.Runtime.Remoting.Messaging.CallContext.SetData("ip", data);
Console.WriteLine("press enter to exit");
Console.Read();
}
}
在服务器端
static class Server
{
public static string GetClientIP()
{
return (string)System.Runtime.Remoting.Messaging.CallContext.GetData("ip");
}
}
这样我们就可以在服务器端的任意地方调用Server.GetClientIP()方法获得当前请求的客户端IP。