C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Technologies\Remoting这里有不少例子

解决方案 »

  1.   

    NET Remoting完全可以适用于各种分布式程序的开发,而且通过使用客户端配置文件以及将Remoting对象host在IIS上,可以使Remoting在代码级别完全透明。程序员只需要new MyClass()即可创建一个远程的引用。而且,在这种配置下,还能够利用.NET Framework的pooling功能。
      

  2.   

    Remoting的对象生存期包括Single-Call, Singlton和Client-Activate三种。其中Single-Call的开销比较大,一般不用于大型的系统。Singleton和Client-Activate的选择取决于程序的框架设计,例如远程对象是无状态的(可以用Singlton)还是有状态的(需要用Client-Activate)。和直接在客户端程序中访问数据库的做法,Remoting的使用会降低系统以及客户端程序的Performance。尤其当使用HttpChannel的时候,初始化远程对象的引用会比较耗时。此时如果客户端为WinForm,则当创建远程引用的时候需要使用多线程以防止GUI阻塞。
      

  3.   

    更详细的Remoting资料可以在MSDN中以"remoting"为关键字搜索得到,其中包括很多Guideline, Best Practice以及Sample Code。
      

  4.   

    我给你解释一下什么是服务器段激活对象:
      所谓服务器端激活对象就是对象的实体是存在于服务器上,即对于任何客户端对服务器端组件的调用会在服务器创建调用的类的实体对象,而不会在客户机上创建这样一个实体(当然客户端是通过该队相对应的代理来和服务器的远程对象通信)。
       和绕口令一样。呵呵。关于SingleCall和Singleton;
       他们都属于服务器端激活,但是他们的区别还是非常大的;
       主要的区别是:SingleCall他会为每个客户端调用产生一个对象实例,举个例子,假设有可远程调用的类test1,当我们在客户端使用
    test1 uCall=(test1 )Activator.GetObject(typeof(test1),"XXXXX");得到对象实体以后我们就可以使用这个实体了,如同使用本地的.NET装配件一样。但是uCall的每一次调用得到的都不是同一个实体,如何理解呢?是这样的,假设这个类有属性property0和property1,方法有method0,method1;当你使用uCall.property0然后又使用uCall.property1这时候记住你现在访问了类test1的两个实体,虽然代码看上去只是一个uCall实体,其实不然,你可以自己试一下,即uCall.property0和uCall.property1这两个连续的调用访问的是不同的实体而不是同一个实体,这就应征了“SingleCall他会为每个客户端调用产生一个对象实例”这句话;当然Singleton我也就不用多说了,如果你需要维持状态的调用,即每个客户端调用访问的都是同一个实体的话就用他-Singleton
            以上是个人的愚见,如果有误,还忘大家给与指正。
      

  5.   

    随便说一下,我在microsoft.com/china见到的remoting的例子,怎么都会有一个中间的
    代理程序呀,不管是服务器端激活还是客户端激。
    其实实际应用中可不可以不需要这个代理程序呀。因为如果要调用远程组件一定要启用
    代理程序。这里不是很麻烦吗,等于在服务器上还要装上一个程序还要控制它。
    实际上是不是这样的呀,应该可以像webserver一样可以远程激活吧.......?????????
      

  6.   

    楼上的,我怎么没见过有中间代理的程序?
    我估计你理解错了,他所谓的中间代理程序可能就是指的客户端的代理,这个东西.NET会为你自动配置,当然,为了提高效率,你也可以自己用代码配置。
      

  7.   

    TO:storm97(风暴不再) ( ) 信誉:98 你看看这个例子:
    http://www.microsoft.com/china/msdn/library/dnhcvs03/html/vs03d1.asp此解决方案包含运行“Digits of Pi”应用程序所需的三个项目(Client、Server 和 ServerLoader)。
    除了client程序和server组件外还有一个serverloader,要调用server组件先要运行serverloader程序才行。希望你能指点
      

  8.   

    serverloader程序可以是客户端代理或是服务器端代理,但我觉得这个东西有点麻烦
    如果能没有它程序remoting就会像是本地调用一样对吧
      

  9.   

    我给你解释一下他的那个例子的模型,即为什么需要它所说的那种结构,要实现.NET Remoting激活要完成以下工作:
    1.创建你的分布式应用的应用逻辑(也就是我们常说的业务逻辑层,当然你也可以直接理解为服务器提供给我们的可以使用的功能);在那个例子中就是Plouffe_Bellard.dll这个装配件,它里面封装了我们将来会使用的一些应用逻辑或者说是应用功能;所以说Plouffe_Bellard.dll是来完成这个第一步工作的。
    2.在服务器端创建传输远程调用消息的通道,也就是打开一个指定的通道,并在服务器上注册这个通信信道,这个通道被用来完成服务器端对象和客户端对象的通信工作,当然通道可以有多种注册方式,简单的我现在举一个注册TCP通道的例子:
    int REMOTE_PORT=9002;
    TcpServerChannel channel=new TcpServerChannel(REMOTE_PORT);
    ChannelServices.RegisterChannel(channel);
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(您要使用的可远程调用的组件,如TestClass.ClsTest),Your URI,WellKnownObjectMode.SingleCall或是Singleton);
    //方法RegisterWellKnownServiceType中各参数的含义大家可以查MSDN了解,我这里就不多说了。
    只有完成了这个步骤你这个服务器才会真正提供这个可远程调用的组件,也就是相当于在服务器上发布了这个Web Service,可以理解吧!
    在ivt(零下一度(.net版)) 所说的那个例子里面DigitsOfPi.exe肯定就是做第二步这个工作的。
    3.好了,有了以上两步,那我们在客户端就可以使用这个可远程调用的组件了,那么怎么使用它呢?当然不能和使用本地的装配件一样采取添加引用->实例化这种途径了,首先,要明白你现在要使用的不是本地一个装配件中某个类的实例,我们要使用远程主机上某个装配件中某个类的实例,所以必须从远程主机上获取对象,要从远程主机上获取对象就要在客户机上创建通信信道,以便使我们能够从这个信道得到远程主机上对象的状况及他的实例,我们的客户端不需要直接和服务器打交道获得远程对象,我们是通过存在与客户端的代理来实现对远程对象的访问的。这中间有一系列复杂得操作过程,但好的是微软已经替我们做好了,我们不需要关心其中的细节。当然,如果有需要您也可以自己用代码来完成这些细节。(我就不一一介绍了,有兴趣自己看MSDN)到这里您一定会问,什么是客户端的代理?如何使用客户端代理访问远程对象?客户端代理帮助我们完成与服务器通信(其实也不是客户端代理直接于服务器通信,中间还有若干步骤,不过我们可以视而不见:))来得到服务器的远程对象;使用客户代理获得远程对象可创建客户端代理在代码中是一句话如下:
    //为了对应我上面的服务器端程序我在客户端同样注册了TCP信道
    ChannelServices.RegisterChannel(new TcpClientChannel());
    XXX.XXX xxx=(XXX.XXX)Activator.GetObject(typeof(XXX.XXX), "tcp://ServerName":PortNum/URI");
    这时候xxx就是您需要得服务器的远程对象;
    而Activator.GetObject(typeof(XXX.XXX), "tcp://ServerName":PortNum/URI");就是客户端代理的创建;
    好了这就是一个很简单但是很完整的.NET Remoting的模型了,在ivt(零下一度(.net版))所说的那个例子中,完成这部分功能得应该是ServerLoader.exe;
    现在应该很明白了吧!!
        也就是说客户端一定要有代理才能得到远程对象的实例,否则是无法进行远程调用的通信的而这个代理其实你也可以理解为客户端去得到(请求)一个远程对象的实例的动作。
      

  10.   

    唉,在CSDN一个好的话题常常没几个人参与讨论,前几天想和大家讨论一下 SingleCall 模式负载均衡、状态保存的话题,也是没人参与,郁闷阿
      

  11.   

    我觉得 storm97(风暴不再) 讲得相当不错!!!