zoukankan      html  css  js  c++  java
  • 跟着Artech学习WCF(3) wcf 的状态问题

    开始以为是wcf的session问题 敲了一边代码发现里面没有用session存储数据 经过 自己研究才发现作者是再将wcf的状态存储问题

    项目结构如下

    dddddd

    代码如下

    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>
  • 相关阅读:
    MySQL DNS反查导致连接缓慢
    重写官方TodoList,对于初学react+redux的人来说,很有好处
    第一个博客试一试
    需求分析
    原来==的优先级比&高 (转自地址为http://blog.163.com/cynicly@126/blog/static/1206105820103893715302/的网易博客)
    E: 无法获得锁 /var/lib/apt/lists/lock open (11 Resource temporarily unavailable)
    我的博客园终于开通啦!
    (转自CSDN日新为道的专栏)printf的格式控制符,在CSDN看到的,转在这里
    qrc_image.cpp未找到
    QT打开保存的html文件无法显示图片
  • 原文地址:https://www.cnblogs.com/qqloving/p/2165474.html
Copyright © 2011-2022 走看看