WCF三种实例激活的类型——实践理解三种类型的区别

       从一开始接触WCF就知道这三种实例激活的类型:单调服务(PerCall)、会话服务(Sessionful)、单例服务(Singleton),但也仅仅是“知道”、“听过”而已,每次也都是看到大段的文字描述这三种类型,而每次也都是看得晕晕乎乎,其实一般看这些东西都是睡觉,只能用实践来解释理论了,不多说了,直接实践吧,O(∩_∩)O~:

      服务端代码:

    [ServiceContract(Name = "GigManagerServiceContract", Namespace = "http://www.thatindigogirl.com/samples/2006/06")]
    public interface IGigManagerService
    {
        [OperationContract(IsOneWay=true)]
        void SaveGig(int x);

        [OperationContract]
        double GetGig();
    }
   [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class GigManagerService : IGigManagerService
    {
        private double _result;

        #region IGigManager Members

        public void SaveGig(int x)
        {
            Console.WriteLine("The Add method is invoked and the current session ID is: {0}", OperationContext.Current.SessionId);
            this._result += x;
        }

        public double GetGig()
        {
            return this._result;
        }

        #endregion

        public GigManagerService()
        {
            Console.WriteLine("Calculator object has been created");
            
        }

        ~GigManagerService()
        {
            Console.WriteLine("Calculator object has been destoried");
        }
    }

宿主代码:

        static void Main(string[] args)
        {

            using (ServiceHost host = new ServiceHost(typeof(GigManager.GigManagerService)))
            {
                host.Opened += delegate
                {
                    Console.WriteLine("The Calculator service has begun to listen");
                };
                host.Open();
                Timer timer = new Timer(delegate { GC.Collect(); }, null, 0, 100);
                Console.Read();
            }
        }


客户端代码:

        static void Main(string[] args)
        {
            GigManagerServiceContractClient client1 = new GigManagerServiceContractClient();
            Console.WriteLine("Invocate client1.saveGig(1)");
            client1.SaveGig(1);
            Console.WriteLine("Invocate client1.saveGig(2)");
            client1.SaveGig(2);

            Console.WriteLine("The Result return via client1.GetGig() is :{0}", client1.GetGig());

            GigManagerServiceContractClient client2 = new GigManagerServiceContractClient();
            Console.WriteLine("Invocate client2.saveGig(1)");
            client2.SaveGig(1);
            Console.WriteLine("Invocate client2.saveGig(2)");
            client2.SaveGig(2);

            Console.WriteLine("The Result return via client2.GetGig() is :{0}", client2.GetGig());

            Console.ReadLine();
        }


在服务端代码中[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]的InstanceContextMode设置的就是实例激活的类型,

如下图为InstanceContextMode = InstanceContextMode.PerCall的执行结果:

1)“Calculator object has been created“出现6次,说明每次服务端发出请求,就会获得一个新建的专门的服务实例,这样也可以证明输出结果为0

如下图为InstanceContextMode = InstanceContextMode.PerSession的执行结果:

1)当客户端为该服务创建一个新的代理时,会获得一个新建的专有的服务实例,它与相同服务的所有其他实例无关,该实例将一直保留在服务中直到客户端不再需要它,因此在下图中”Calculator object has been created“只会出现2次,而两次的输出结果是3

如下图为InstanceContextMode = InstanceContextMode.Single的执行结果:

1)单例服务是一种极端的共享式服务,所有客户端都将独自连接相同的单个知名实例,而不考虑它们连接的是服务的哪一个终结点,单例服务的生存期是无限的,只有在关闭宿主时才会被释放,创建宿主时,单例服务会被创建,且只能被创建一次,因此下图中“Calculator object has been created”只出现一次,而输出的结果分别为3和6


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值