原文:[老老实实学WCF] 第七篇 会话

老老实实学WCF

第七篇 会话

通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了。从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高效、稳定和安全。

首先我们来学习会话。

1. 什么是会话

会话是通信双方进行通信的一个时间片、一个语境或者说一个上下文,在这个特定的环境中,通信的双方是彼此认识的,就像两个人在聊天,他们都很清楚谁在聆听自己讲话,也很清楚对方讲的话是给自己听的,简单的说就是通信双方是可以记住彼此的。

一旦会话结束了,通信双方就忘记了彼此,即使他们再次建立会话,他们也不会记得他们上次会话的内容,也就是他们不记得他们曾经见过面。

这在我们现实世界中或许很难想象,但是在通信的世界里就是这样的。服务端不可能记住每个跟他通信的人,他只能在一段时间内(会话)记住一个人。

这个特性是很有用的,有些逻辑需要客户端和服务端通信多次才能完成,在这个期间双方需要记住彼此,而且会话也是很多其他特性实现的基础,例如双工通信。

2. 如何建立会话

那么我们要想建立一个会话通信,应该具备怎样的条件呢?

(1) 需要支持会话的绑定。绑定描述了双方的通信方式,不同的绑定对会话的支持是不同的,比如basicHttpBinding是不支持会话的,而wsHttpBinding就是支持的。要建立会话通信,这个通信必须首先使用支持会话的绑定。

(2) 让服务协定支持会话,服务协定实际上就是通信的通道(见第四、五篇),让服务协定支持会话,那么就可以在这个通信通道上支持会话了。

选择支持会话的绑定我们知道怎么做,可如何让服务协定支持会话呢?要用到在修饰服务协定的SeviceContract属性,我们知道被这个属性修饰的接口是一个服务协定,其实这个属性也拥有属性,其中一个属性叫做SessionMode。这是一个枚举,我们通过设置这个枚举的值来配置服务协定是否支持会话。例如:

[ServiceContract(SessionMode = SessionMode.Required)]public interface IHelloWCF{[OperationContract]string HelloWCF();}

这段代码中,我把SessionMode设置为了Required,这表示调用这个服务协定的客户端必须使用会话。

SessionMode有三个可能的值:

1) Allowed:这是默认值,表示这个服务协定是允许会话的,客户端可以选择用会话连接,也可以选择不用会话连接。

2) Required:表示服务协定要求客户端连接必须使用会话。

3) NotAllowed:表示服务协定不允许使用会话连接。

这些配置需要搭配其他的配置才能起到实际意义,比如服务实例模式,服务端和客户端调用模式等等,等我们了解到这些特性的时候再展开,现在我们只需要知道,前两种配置是支持会话的,第三种是不支持的。

3. 一个简单的例子

我们通过一个简单的例子来看看允许会话与不允许的区别,我修改了前几篇中寄存在IIS中的服务,代码如下:

using System;
using System.ServiceModel;namespace LearnWCF
{[ServiceContract(SessionMode = SessionMode.Allowed)]public interface IHelloWCF{[OperationContract]string HelloWCF();}public class HelloWCFService : IHelloWCF{private int _Counter;public string HelloWCF(){_Counter++;return "Hello, you called " + _Counter.ToString() + " time(s)";}}
}

首先我们把服务协定的会话模式设置为允许会话(Allowed),在服务实现中,我为服务实现类定义了一个计数器成员,每次调用都会将这个计数器加一,然后返回一句话告诉客户端调用了多少次。

服务端的配置文件如下:

<configuration><system.serviceModel><services><service name="LearnWCF.HelloWCFService" behaviorConfiguration="metadataExchange"><endpoint address="" binding="wsHttpBinding" contract="LearnWCF.IHelloWCF"/><endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/></service></services><behaviors><serviceBehaviors><behavior name="metadataExchange"><serviceMetadata httpGetEnabled="true" /></behavior></serviceBehaviors></behaviors></system.serviceModel>
</configuration>

在这里我配置了支持会话的wsHttpBinding。

客户端的调用代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication2
{class Program{static void Main(string[] args){ConsoleApplication2.ServiceReference1.HelloWCFClient client = new ServiceReference1.HelloWCFClient();Console.WriteLine(client.HelloWCF());Console.WriteLine(client.HelloWCF());client.Close();Console.Read();}}
}

就是连续调用两次服务端的方法并输出结果。

F5运行一下,会看到下面的结果:

我们看到提示调用了两次,也就是说服务端记住了客户端,当他第二次调用的时候将将计数器加一,就返回了调用两次。当然这个局面的形成还受到实例上下文模式为PerSession的影响,我们后面会展开,总之服务协定支持会话,才出现了这个局面。

如果我们把SessionMode改成NotAllowed,其他不改动,结果就会是下面的样子:

结果两次都是1,说明服务器在第二次受到调用的时候已经忘记了之前那个客户端,他又分配了一个新的计数器给这个客户端,所以计数就总是1了。

其实这个例子是很粗糙的,这里面还有些其他的影响因素,我们就是通过这个例子来看看SessionMode的一方面影响。

4. 总结

这一篇的内容比较少,我们应该记住一些要点,在以后接触更多特性的时候才不会混淆。

(1) 是否支持会话首先取决于选择的绑定。

(2) 是否支持会话通过配置服务协定的ServiceContract属性的SessionMode属性实现的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

[老老实实学WCF] 第七篇 会话相关推荐

  1. [老老实实学WCF] 第八篇 实例化

    老老实实学WCF 第八篇 实例化 通过上一篇的学习,我们简单地了解了会话,我们知道服务端和客户端之间可以建立会话连接,也可以建立非会话连接,通信的绑定和服务协定的 ServiceContract 的S ...

  2. [老老实实学WCF] 第三篇 在IIS中寄存服务

    老老实实学WCF 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型,包括定义和实现服务协定.配置服务.寄宿服务.通过添加服务引用的方式配置客户端并访问服务.我 ...

  3. [老老实实学WCF] 第二篇 配置WCF

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: [csharp] view plaincopyprint? ...

  4. [老老实实学WCF] 第一篇 Hello WCF

    老老实实学WCF  第一篇 Hello WCF WCF(Windows Communication Foundation)是微软公司推出的面向服务技术的集大成者,涵盖继承了其之前发布的所有的分布式应用 ...

  5. 从零开始学产品第七篇:常用的功能模块有哪些

    一个系统中都有哪些模块组成,对于初学者来说,可能还不能够区分的很清楚. 但是仔细回想一下,是不是几乎所有的功能都有登录和注册的功能? 启动页,Banner,轮播,个人中心,关于我们,意见反馈,设置,忘 ...

  6. 一起来学SpringBoot | 第八篇:通用Mapper与分页插件的集成

    **本文作者:**唐亚峰 本文链接:http://blog.battcn.com/2018/05/10/springboot/v2-orm-mybatis-plugin/ **版权声明:**本博客所有 ...

  7. 菜鸟学Linux 第044篇笔记 算法和私有CA

    菜鸟学Linux 第044篇笔记 算法和私有CA 证书吊销列表CRL(Certificate Revocation List ) 如何解决私钥丢失 PKI: Public Key Infrastruc ...

  8. 十五天精通WCF——第七天 Close和Abort到底该怎么用才对得起观众

    原文:十五天精通WCF--第七天 Close和Abort到底该怎么用才对得起观众 一:文起缘由 写这一篇的目的源自于最近看同事在写wcf的时候,用特别感觉繁琐而且云里雾里的嵌套try catch来防止 ...

  9. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

最新文章

  1. CSDN 居然免费送会员?程序员们快来领!
  2. Linux C编程--线程操作1--线程概述和简单的线程操作
  3. python在哪里写程序和运行-如何编写和运行Python程序
  4. spring cloud入门_Spring Boot 2.x基础教程:快速入门
  5. 腾讯企业邮箱报错 smtp.exmail.qq.comport 465, isSSL false
  6. 从硬核科幻小说《三体》中看嵌入式
  7. c语言编写期末考试成绩,C语言期末考试卷(A卷含答案).doc
  8. java显示目录文件列表和删除目录
  9. 洛谷 P2765 魔术球问题 解题报告
  10. 怎么在html中加入相对链接,html直接跳转超链接 html中怎么实现同一页面超级链接...
  11. 读书笔记_中国期货市场量化交易(李尉)01
  12. DAX/PowerBI系列 - 玩转阿里云 Alicloud Pricing
  13. python猴子补丁_Python猴子补丁Monkey Patch用法实例解析
  14. 20190528论文笔记
  15. 仅109美元 搞一套Evive物联网开发工具包回家耍
  16. API(应用程序编程接口)
  17. 数学建模:排队论模型
  18. Mac SDK环境变量配置
  19. 产品经理入职四部曲—带你顺利度过试用期
  20. 微信小程序的简单使用(做一个阻抗计算器)

热门文章

  1. 导线坐标计算软件_8套超全建筑工程测量计算表,输入参数得到精确结果,从此不加班...
  2. QT教程1:ubuntu18.04安装QT5
  3. iphone以旧换新活动_iPhone:我降价 1600 元!安卓:我有 5G
  4. 为什么python不出结果_Python 的 Checksum 为什么结果是一长串数字而不是如下效果...
  5. 递归删除单链表中所有值为x的元素_如何纯递归反转链表的一部分
  6. 给数组里面的对象添加一个新的数据
  7. jQuery 实例 教程
  8. 《你必须知道的495个C语言问题》知识笔记及补充
  9. Tomcat容器入门介绍
  10. 用Hadoop1.0.3实现KMeans算法