• 【分享】C# Remoting 简介


    网上找到C# Remoting 简介的知识,觉得还是比较容易理解的,分享给大家
     
    一.Remoting 有两种通道:
    1.TcpChannel通道
    2.Http通道类型
    
    二.远程对象的激活方式
    1.服务器端激活,又称 WellKnow 方式。服务器端激活又分为SingleTon和SingleCall两种模式。SingleTon模式:此为有状态模式。如果设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,如果一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。如果设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。如果熟悉Asp.Net的状态管理,我们可以认为它是一种Application状态。
    
    SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp.Net的状态管理,认为它是一种Session状态。
    
    2.客户端激活。与WellKnown模式不同,Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。
    
    
    
    
    
    根据激活模式的不同,通道类型的不同服务器端的实现方式也有所不同。大体上说,服务器端应分为三步:
    
    1、注册通道
    
    要跨越应用程序域进行通信,必须实现通道。如前所述,Remoting提供了IChannel接口,分别包含TcpChannel和HttpChannel两种类型的通道。这两种类型除了性能和序列化数据的格式不同外,实现的方式完全一致,因此下面我们就以TcpChannel为例。
    
    注册TcpChannel,首先要在项目中添加引用“System.Runtime.Remoting”,然后using名字空间:System.Runtime.Remoting.Channel.Tcp。代码如下:
                TcpChannel channel = new TcpChannel(8080);
                ChannelServices.RegisterChannel(channel);
    
    在实例化通道对象时,将端口号作为参数传递。然后再调用静态方法RegisterChannel()来注册该通道对象即可。
    
    2、注册远程对象
    
    注册了通道后,要能激活远程对象,必须在通道中注册该对象。根据激活模式的不同,注册对象的方法也不同。
    
    (1) SingleTon模式
    
    对于WellKnown对象,可以通过静态方法RemotingConfiguration.RegisterWellKnownServiceType()来实现:RemotingConfiguration.RegisterWellKnownServiceType(
                    typeof(ServerRemoteObject.ServerObject),
                    "ServiceMessage",WellKnownObjectMode.SingleTon);
    
    (2)SingleCall模式
    
    注册对象的方法基本上和SingleTon模式相同,只需要将枚举参数WellKnownObjectMode改为SingleCall就可以了。RemotingConfiguration.RegisterWellKnownServiceType(
                    typeof(ServerRemoteObject.ServerObject),
                    "ServiceMessage",WellKnownObjectMode.SingleCall);
    
    (3)客户端激活模式
    
    对于客户端激活模式,使用的方法又有不同,但区别不大,看了代码就一目了然。
    RemotingConfiguration.ApplicationName = "ServiceMessage";
    RemotingConfiguration.RegisterActivatedServiceType(
                    typeof(ServerRemoteObject.ServerObject));
    
    为什么要在注册对象方法前设置ApplicationName属性呢?其实这个属性就是该对象的URI。对于WellKnown模式,URI是放在RegisterWellKnownServiceType()方法的参数中,当然也可以拿出来专门对ApplicationName属性赋值。而RegisterActivatedServiceType()方法的重载中,没有ApplicationName的参数,所以必须分开。
    
    3、注销通道
    
    如果要关闭Remoting的服务,则需要注销通道,也可以关闭对通道的监听。在Remoting中当我们注册通道的时候,就自动开启了通道的监听。而如果关闭了对通道的监听,则该通道就无法接受客户端的请求,但通道仍然存在,如果你想再一次注册该通道,会抛出异常。
    
               //获得当前已注册的通道;
                IChannel[] channels = ChannelServices.RegisteredChannels;
    
                //关闭指定名为MyTcp的通道;
                foreach (IChannel eachChannel in channels)
                {
                    if (eachChannel.ChannelName == "MyTcp")
                    {
                        TcpChannel tcpChannel = (TcpChannel)eachChannel;
    
                        //关闭监听;
                        tcpChannel.StopListening(null);
    
                        //注销通道;
                        ChannelServices.UnregisterChannel(tcpChannel);
                    }
                }
    代码中,RegisterdChannel属性获得的是当前已注册的通道。在Remoting中,是允许同时注册多个通道的。 

    作者:chhuic

    出处:http://chhuic.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    博客园定制
    【杂文】久 等 了
    【杂文】随心一记
    NOIP2021游寄
    【python】mac+appium+python的环境配置完整流程
    压力测试平台(nGrinder)入门到精通教程
    Gunicorn启动flask项目
    统计代码测试覆盖率Python
    Android开发Google Pixel、Google Nexus系列手机刷机获取root并且设置ro.debuggable=1的方法
    c宏定义#define、#、##、__VA_ARGS__符号的理解
  • 原文地址:https://www.cnblogs.com/chhuic/p/2343616.html
Copyright © 2020-2023  润新知