跟着Artech学习WCF(3) wcf 的状态问题

简介: 开始以为是wcf的session问题 敲了一边代码发现里面没有用session存储数据 经过 自己研究才发现作者是再将wcf的状态存储问题 项目结构如下   代码如下 using System; using System.

开始以为是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>
test
相关文章
|
10月前
|
网络协议 网络架构 Windows
框架学习——WCF框架
框架学习——WCF框架
233 0
|
安全 C#
WCF技术我们应该如何以正确的方式去学习掌握
一、WCF技术我该如何学习?       阿笨的回答是:作为初学者的我们,那么请跟着阿笨一起玩WCF吧,阿笨将带领大家如何以正确的姿势去掌握WCF技术。由于WCF技术知识点太多了,就纯基础概念性知识都可以单独出一本书来讲解,本次分享课程《C#面向服务编程技术WCF从入门到实战演练》开课之前,阿笨还是希望从没了解过WCF技术的童鞋们提前先了解一下WCF技术,至少要明白WCF技术的ABC三要素分别指的是什么。
1173 0
|
机器学习/深度学习 消息中间件 开发框架
跟着Artech学习WCF(4) MSMQ 绑定
曾几何时 再看大家讨论各种构架时,经常出现在各个服务器间传递数据,经常出现MSMQ, 那是看到这个心理就郁闷,怎么整天折腾ASP.NET 就没遇见过这个东西 原来这个家伙藏在WCF里面 嘿嘿这次被我发现了 首先 第一次装IIS的话 默认是没有安装msmq 所以需要自己安装的   看Art...
785 0
|
网络协议 安全 Windows
跟着Artech学习WCF(1)
折腾了老半天双向通信,不是端口绑定不上 就是创建代理失败要摸是 代理没有及时关闭Artech的代码看了半天无论是照抄还是改良都是不行,无奈到处看看test最后终于解决了 绑定协议现在只试了http还没有事tcp的 项目结构图如下   目前感觉客户端的调用部分代码很多不 来自博客园地址忘了呵呵     代码如下 using System; using System.
628 0
|
安全 Windows
跟着Artech学习WCF(2) netTcpBinding 绑定
netTcpBinding 绑定真是坑爹啊 因为一直围绕着iis的缘故 很少搞这个东西,这次计划系统的学习WCF 才搞的 没搞不知道一搞晕菜 配置了半天才弄好 最晕菜的是在省城代理类时 的地址 更晕菜 这次配置OK了 保存一下 以备他日不时之需 首先netTcpBinding是服务器端的配...
751 0
|
XML 数据格式
跟着Artech学习WCF 省的看书没环境没心情尤其没有看书的环境只有上网的环境
Artech的 我的WCF之旅(1):创建一个简单的WCF程序 http://www.cnblogs.com/artech/archive/2007/02/26/656901.html   以前自己练习WCF是总是通过创建客户端代理类和实现所有东西都是放在创建WCF的项目里面,WCF的地址(A...
866 0
|
10月前
|
前端开发
WCF更新服务引用报错的原因之一
WCF更新服务引用报错的原因之一
|
9月前
|
C# 数据安全/隐私保护
c#如何创建WCF服务到发布(SqlServer版已经验证)
c#如何创建WCF服务到发布(SqlServer版已经验证)
38 0
|
9月前
|
安全 数据库连接 数据库
WCF服务创建到发布(SqlServer版)
在本示例开始之前,让我们先来了解一下什么是wcf? wcf有哪些特点? wcf是一个面向服务编程的综合分层架构。该架构的项层为服务模型层。 使用户用最少的时间和精力建立自己的软件产品和外界通信的模型。它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案。且能与已有系统兼容写作。 简单概括就是:一组数据通信的应用程序开发接口。
62 0