RegisterActivatedServiceType RegisterActivatedClientType 客户端激活
RegisterActivatedServiceType
RegisterActivatedClientType
客户端激活
https://www.cnblogs.com/woxpp/p/3995366.html
与WellKnown模式不同, Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的:首先,对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由 GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。
using System; using System.Runtime.Remoting.Metadata; /*code 释迦苦僧*/ namespace MessageMarshal { /*创建发送消息委托*/ public delegate void SendMessageHandler(string messge); [Serializable] public class TestMessageMarshal : MarshalByRefObject { private Guid ID { get; set; } /*新建对象实例时重新创建标识编号*/ public TestMessageMarshal() { ID = Guid.NewGuid(); } /*创建发送消息事件*/ public static event SendMessageHandler SendMessageEvent; /*发送消息*/ [SoapMethod(XmlNamespace = "MessageMarshal", SoapAction = "MessageMarshal#SendMessage")] public void SendMessage(string messge) { if (SendMessageEvent != null) SendMessageEvent(ID.ToString() + "\t" + messge); } } }
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using System.Runtime.Remoting.Channels.Tcp; using MessageMarshal; /* 客户端激活 与WellKnown模式不同, Remoting在激活每个对象实例的时候, 会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求, 将为每一个客户端都建立一个实例引用。 SingleCall模式和客户端激活模式是有区别的: 首先,对象实例创建的时间不一样。 客户端激活方式是客户一旦发出调用的请求,就实例化; 而SingleCall则是要等到调用对象方法时再创建。 其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的, 而客户端激活的对象则有状态,其生命周期可自定义。 其三,两种激活模式在服务器端和客户端实现的方法不一样。 尤其是在客户端,SingleCall模式是由 GetObject()来激活, 它调用对象默认的构造函数。 而客户端激活模式,则通过CreateInstance()来激活, 它可以传递参数,所以可以调用自定义的构造函数来创建实例。 1.修改服务端代码 */ namespace TestRemotingServer { /*code:释迦苦僧*/ class Program { static void Main(string[] args) { /*创建HTTP通道*/ HttpChannel channel = new HttpChannel(8226); /*注册通道服务端*/ ChannelServices.RegisterChannel(channel,false); RemotingConfiguration.ApplicationName = "test"; RemotingConfiguration.RegisterActivatedServiceType(typeof(TestMessageMarshal)); Console.WriteLine("started ..."); /*接收客户端事件*/ TestMessageMarshal.SendMessageEvent+=new SendMessageHandler(TestMessageMarshal_SendMessageEvent); Console.Read(); } static void TestMessageMarshal_SendMessageEvent(string messge) { Console.WriteLine(messge); } } }
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; using System.Threading; /*code 释迦苦僧*/ namespace TestRemotingClient { class Program { static void Main(string[] args) { HttpChannel channel = new HttpChannel(); ChannelServices.RegisterChannel(channel, false); /*注册通道 的 远程处理类型*/ RemotingConfiguration.RegisterActivatedClientType(typeof(MessageMarshal.TestMessageMarshal), "http://localhost:8226/test"); /*创建消息实体*/ MessageMarshal.TestMessageMarshal TestMessage = new MessageMarshal.TestMessageMarshal(); while (true) { TestMessage.SendMessage("DateTime.Now:" + System.DateTime.Now.ToString()); Console.WriteLine("send message..."); Thread.Sleep(2000); } } } }

浙公网安备 33010602011771号