.NET Remoting 经典远程回调模型(一)
多层分布式应用开发是老生常谈的话题,其大大小小的框架也不计其数。
记得以前第一次开发分布式应用程序时候,还是用COM,那家伙,难的咧。。。!!
还是借助delphi,光说配置成功都花了我好几个星期(实话),到处找资料,
请教高手....结果算是实现了多台机器的分布式应用了,但很不灵活,每重
配置一次,难受一次!!
在.NET Remoting, WCF 大行其道的今天,一切问题迎刃而解!
这里就说说我在实际工作用到的一点东西,与大家共同学习,一起进步!
.NET Remoting 的一些基础问题我就不讲了,只说说.NET Remoting 中
的经典回调机制:
1, 使用 AsyncCallback. 这是较为简单的技术,但是却增加了客户代码的
负担,有一个好处是不需要部署特定的元数据。
2,向服务器传递定制委托。这项技术需要服务端一些特别支持,但是将客户端
责任最小化了,然而,却使元数据部署复杂化。
3, 向服务端传递一个回调接口,需要服务器特别支持,它也可讲客户端的
责任最小化,且不需要部署任何额外的元数据。
A, 使用AsyncCallback.
直接看代码更直观:
class ClientMain
{
delegate int opDelegate(int n1,int n2)
static void Main(string[] args)
{
simpleMath math = (simpleMath)Activator.GetObject(typeof(simpleMath),"http://localhost:6666/MyURI.soap");
opDelegate op=math.Add ;// (也可 new opDelegate(math.Add))
IAsyncResult asyncResult = op.BeginInoke(5,2,new AsyncCallback(AddCallback),"回调完成");
}
static void AddCallback(IAsyncResult ar)
{
AsysResult asysResult =(AsysResult)ar;
opDelegate op=(opDelegate)asysResult.AsyncDelegate;
int result = op.EndInvoke(ar);
Console.WriteLine(result.tostring());
}
}
服务端:
public class SimpleMath: MarshalByRefObject
{
public SimpleMath()
{}
public int Add(int n1,int n2)
{
return n1+n2;
}
}
static void Main(string[] args)
{
ChannelServices.RegisterChannel(new HttpChannel(6666));
RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleMath),"MyURI.soap",WellKnownObjectMode.Singleton);
}
这里,我们使用的是HTTP,当然也可用其他的,如TCP
还啰嗦下 singleton / singlecall, 前者:远程对象的一个实例处理所有的客户请求。后者:
每个客户请求分配一个新实例,并在请求返回后释放这个实例。