一、Remoting 的优缺点?
优点:
1、能让我们进行分布式开发 2、Tcp 通道的 Remoting 速度非常快 3、虽然是远程的,但是非常接近于本地调用对象 4、可以做到保持对象的状态 5、没有应用程序限制,可以是控制台,winform,iis,windows 服务承载远程对象
缺点:
1、非标准的应用
因此有平台限制 2、脱离 iis 的话需要有自己的安全机制
三、最简单的 Remoting 的例子
1、远程对象:
建立类库项目:RemoteObject
using System; namespace RemoteObject { public class MyObject:MarshalByRefObject { public int Add(int a,int b) { return a+b; } } }
2、服务端
建立控制台项目:RemoteServer
using System; using System.Runtime.Remoting; namespace RemoteServer { class MyServer { [STAThread] static void Main(string[] args) { RemotingConfiguration.Configure("RemoteServer.exe.config"); Console.ReadLine(); } } }
建立配置文件:app.config
<configuration> <system.runtime.remoting> <application name="RemoteServer"> <service> <wellknown type="RemoteObject.MyObject,RemoteObject" objectUri="RemoteObject.MyObject" mode="Singleton" /> </service> <channels> <channel ref="tcp" port="9999"/> </channels> </application> </system.runtime.remoting> </configuration>
3、客户端:
建立控制台项目:RemoteClient
using System; namespace RemoteClient { class MyClient { [STAThread] static void Main(string[] args) { RemoteObject.MyObject app = (RemoteObject.MyObject)Activator.GetObject(typeof(RemoteObject.MyObject),System.Configuratio n.ConfigurationSettings.AppSettings["ServiceURL"]); Console.WriteLine(app.Add(1,2)); Console.ReadLine(); } } }
建立配置文件:app.config
<configuration> <appSettings> <add key="ServiceURL" value="tcp://localhost:9999/RemoteObject.MyObject"/> </appSettings> </configuration>
4、测试
在最后编译的时候会发现编译报错:
1、找不到 app.Add() 2、找不到 RemoteObject
这是因为客户端 RemoteClient 没有添加 RemoteObject 的引用,编译器并不知道远程对象存在哪些成员所以报错,添加引用以后 vs.net 会在客户端也保存一个 dll,可能大家会问这样如果对远程对象的修改是不是会很麻烦?其实不麻烦,对项目编译一次 vs.net 会重新复制 dll。
然后直接运行客户端会出现“目标主机拒绝”的异常,也说明了通道没有打开运行服务端再运行客户端出现“找不到程序集 RemoteObject”!回头想想可以发现我们并在服务端对RemoteObject 添加引用,编译的时候通过是因为这个时候并没有用到远程对象,大家可能不理解运行服务端的时候也通过?这是因为没有这个时候还没有激活远程对象。理所当然,对服务端要添加引用远程对象,毕竟我们的对象是要靠远程承载的。现在再先后运行服务端程序和客户端程序,客户端程序显示 3,测试成功。