跟着Artech学习WCF(3) wcf 的状态问题
2011-09-03 16:44
393 查看
开始以为是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>
相关文章推荐
- 跟着Artech学习WCF 省的看书没环境没心情尤其没有看书的环境只有上网的环境
- 跟着Artech学习WCF(2) netTcpBinding 绑定
- 跟着Artech学习WCF扩展(4) 扩展MessageInspector
- 跟着Artech学习WCF扩展(3) 扩展CallContextInitializer
- 跟着Artech学习WCF(1)
- 跟着Artech学习WCF(1)
- 跟着Artech学习WCF(5) Responsive Service 与自定义Soap Message Header
- 跟着Artech学习WCF扩展(1) Binding进行通信
- 跟着Artech学习WCF扩展(2) 自定义Channel与执行的顺序
- WCF学习问题:获取客户端IP地址
- WCF学习问题记录
- WCF学习问题之:响应消息的内容类型 multipart/related; type="application/xop+xml"……
- WCF学习总结——什么是WCF以及用WCF解决什么问题
- 跟着问题学习Spring Data Jpa---Jpa是什么
- VMvare学习3_Win7解决“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
- 请Artech,dudu 帮忙解答下: WCF 服务返回的如果是接口(remoting有个远程对象封送),(感觉比较难以解决的问题)
- WCF:学习Artech大哥的入门程序
- WCF学习问题之“net.tcp://localhost/service/”不支持正在使用的 .Net 组帧模式。有关详细信息,请参见服务器日志。
- 跟着问题学习Spring Data Jpa----Spring Data Jpa配置
- WCF学习问题之:找不到具有绑定 MetadataExchangeTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 []