跟着Artech学习WCF(3) wcf 的状态问题
开始以为是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) { ChannelFactory<ICalculator> calculatorChannelFactory = new ChannelFactory<ICalculator>("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; } } }
客户端配置如下
<system.serviceModel> <client> <endpoint address="http://localhost:9999/SessionfulCalculator" binding="wsHttpBinding" contract="Contract.ICalculator" name="httpEndpoint" /> </client> </system.serviceModel>
服务端配置如下
<system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="CalculatorBehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="CalculatorBehavior" name="Sevice.CalculatorService"> <endpoint address="" binding="wsHttpBinding" bindingConfiguration="" contract="Contract.ICalculator" /> <host> <baseAddresses> <add baseAddress="http://localhost:9999/SessionfulCalculator" /> </baseAddresses> </host> </service> </services> </system.serviceModel>
test