开始以为是wcf的session问题 敲了一边代码发现里面没有用session存储数据 经过 自己研究才发现作者是再将wcf的状态存储问题
项目结构如下
代码如下
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using Contract;namespace Client{ class Program { static void Main(string[] args) { ChannelFactorycalculatorChannelFactory = new ChannelFactory ("httpEndpoint"); Console.WriteLine("Create a calculator proxy: proxy1"); ICalculator proxy1 = calculatorChannelFactory.CreateChannel(); Console.WriteLine("Invocate proxy1.Adds(1)"); proxy1.Adds(1); Console.WriteLine("Invocate proxy1.Adds(2)"); proxy1.Adds(2); Console.WriteLine("The result return via proxy1.GetResult() is : {0}", proxy1.GetResult()); try { proxy1.Adds(1); } catch (Exception ex) { Console.WriteLine("It is fail to invocate the Add after terminating session because \"{0}\"", ex.Message); } //(proxy1 as ICommunicationObject).Close(); Console.WriteLine("Create a calculator proxy: proxy2"); ICalculator proxy2 = calculatorChannelFactory.CreateChannel(); Console.WriteLine("Invocate proxy2.Adds(1)"); proxy2.Adds(1); Console.WriteLine("Invocate proxy2.Adds(2)"); proxy2.Adds(2); Console.WriteLine("The result return via proxy2.GetResult() is : {0}", proxy2.GetResult()); //(proxy2 as ICommunicationObject).Close(); Console.Read(); } }}
=================================
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace Contract{ [ServiceContract(SessionMode=SessionMode.Required)] public interface ICalculator { //调用任何允许初始化会话服务方法(缺省情况下所有的服务方法都自动初始化Session,也就是 IsInitiating=true)。 //调用任何包含 "IsTerminating=true" 声明的服务方法(缺省情况下所有的服务方法 IsTerminating=false,需要我们显示声明)。 // Terminating 终止意思 Initiating 启动的意思 [OperationContract(IsOneWay=true,IsInitiating=true,IsTerminating=false)] void Adds(double x); [OperationContract(IsInitiating = false, IsTerminating = true)] double GetResult(); }}
========================================
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using Sevice;using System.ServiceModel;namespace Hosting2{ class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) { 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(); } } }}
===========
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Contract;using System.ServiceModel;namespace Sevice{ [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class CalculatorService:ICalculator { public CalculatorService() { Console.WriteLine("Calculator object has been created"); } ~CalculatorService() { Console.WriteLine("Calculator object has been destoried"); } private double _result; void ICalculator.Adds(double x) { Console.WriteLine("The Add method is invoked and the current session ID is: {0}", OperationContext.Current.SessionId); this._result += x; } double ICalculator.GetResult() { Console.WriteLine("The GetResult method is invoked and the current session ID is: {0}", OperationContext.Current.SessionId); return this._result; } }}
客户端配置如下
服务端配置如下