WCF 第五章 会话级别的实例

会话在分布式应用程序中广泛用于维护每个用户的状态。在站点或者基于站点的应用中,将每个用户的状态存储于会话中很常见。这这些情况中,用户和会话间有一个1:1比例。WCF以一个类似的概念支持服务。使用InstanceContextMode.PerSession设置,WCF可以直接为每个会话创建一个服务实例。

提示 实例会话与可信赖会话不同

Per-Session服务实例不应该与另一个WCF特性弄混,可信赖会话。这个特性,实现了WS-RM规范,用来确定在扩媒介的不同终结点间的可信赖的,顺序的消息传输。它与并发或者对象创建行为没有任何关系。

为了实现Per-session服务实例,必须做两件事:在契约层允许会话,在服务层允许会话。

在契约层,会话通过在服务契约上使用SessionMode行为实现。行为的值可以是Allowed,NotAllowed或者Required.尽管会话在契约层确定,它们事实上是由绑定元素在信道层确认。因此,当服务首先启动时,契约行为确认契约和信道是兼容的。例如,如果信道需要会话,但是一个使用的绑定不支持会话(比如basicHttpBinding),那么契约上的会话需求就不能被满足,所以当服务启动时契约行为会抛出一个异常。

在服务层,会话通过为InstanceContextMode.Persession设置InstanceContextMode行为属性来启用。这指导WCF为连接到服务端的每个独一无二的会话创建一个服务实例。InstanceContextMode的其他选项是PerCall或者Single.PerCall为每次调用创建一个新的实例而Single为所有调用者仅维护一个实例。

列表5.5显示了使用InstanceContextMode.PerSession行为的服务端代码。InstanceContextMode行为指导WCF为每个独立的会话创建一个服务实例。除了返回一个stcok price,代码也跟踪记录它被调用了多少次。因为InstanceContextMode被设置成PerSession,客户端能看见它在会话中调用服务的次数,总的数目并不是服务调用的次数。如果InstanceContextMode被设置成Single,客户端将在服务的生命周期内看到所有调用的次数。如果InstanceContextMode被设置成PerCall,客户端将总是看到一次调用的次数。

注意在类中使用一个锁来同步n_calls变量。因为ConcurrencyMode被设置成Multiple,多个线程将会在实例会话范围内执行,所以这很必要。

列表5.5 PerSession 实例


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

[DataContract]

   public class StockPrice

   {

       [DataMember]

       public double price;

       [DataMember]

       public int calls;

   }

   [ServiceContract(SessionMode= SessionMode.Required)]

   public interface IStockService

   {

       [OperationContract]

       StockPrice GetPrice(string ticker);

   }

   [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

   public class StockService : IStockService

   {

       object lockThis = new object();

       int n_Calls = 0;

       StockService()

       {

           Console.WriteLine("{0}:Created new instance of StockService on thread", DateTime.Now);

       }

       public StockPrice GetPrice(string ticker)

       {

           StockPrice p = new StockPrice();

           Console.WriteLine("{0}: GetPrice called on thread {1}", DateTime.Now, Thread.CurrentThread.ManagedThreadId);

           p.price = 94.85;

           lock (lockThis)

           {

               p.calls = ++n_Calls;

           }

           Thread.Sleep(5000);

           return p;

       }

   }

图片5.5 显示了两个客户端(左边)输出和服务端(右边)输出。因为两个客户端并发执行,所以左边有两个窗口。每个客户端异步调用GetPrice三次。服务端输出显示服务类有两个实例被创建-每个客户端会话一个实例。注意每个客户端只能查看它们发送请求数目,而不是服务端处理的所有请求数目。这是因为计数器,n_Calls,存储在服务会话实例中,所以每个实例有一个初始化为0的计数器。如果InstanceContextMode变成PerCall,每个客户端输出将会看到每个成功的调用计数都是1.如果InstanceContextMode改成Single,每个客户端将会看到成功调用数目从1变成6,取决于两个客户端调用。

图片5.5 会话敏感服务输出

时间: 2024-07-28 23:26:19

WCF 第五章 会话级别的实例的相关文章

UNP学习笔记(第五章 TCP客户/服务程序实例)

我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 1 #include "unp.h" 2 3 int 4 main(int argc, char **argv) 5 { 6 int listenfd, connfd; 7 pid_t childpid; 8 socklen_t clilen; 9 struct sockaddr_in cliaddr, servaddr; 10 11 l

第五章 会话跟踪

Cookie机制 1.Cookie不可跨域名性 2.Unicode编码:中文 3.Cookie属性设置 4.Cookie的修改,删除 5.Cookie的域名 6.Cookie的路径 7.Cookie的安全属性 8.javascript操作Cookie 9.案例:永久登陆 Session 1.Session机制 2.实现用户登录 3.生命周期 4.有效期 5.Session的常用方法 6.Session对浏览器的要求 7.URL地址重写 服务器判断用户请求是否是同一个session,是通过用户端携

JavaScript高级程序设计(第3版)第五章读书笔记

第五章 引用类型 创建Object实例的方式有两种,第一种是使用new操作符后跟Object构造函数,例如: var person = new Object( ); person.name = “Nicholas”; person.age=29; 第二种是使用对象字面量表示法.如: var person = { name : “Nicholas”, age : 29 }; 在最后一个属性后面添加逗号,会在IE7及更早版本和Opera中导致错误. 两种访问对象属性的方法,一是方括号语法,例如per

[老老实实学WCF] 第五篇 再探通信--ClientBase

原文:[老老实实学WCF] 第五篇 再探通信--ClientBase 老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创建了通道,实现了和服务端的通信.然而,与服务端通信的编程模型不只一种,今天我们来学习利用另外一个服务类ClientBase<>来完成同样的工作,了解了这个类的使用方法,我们对服务引用中的关键部分就能够理解了. ClientBase

《Spring实战》学习笔记-第五章:构建Spring web应用

之前一直在看<Spring实战>第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读<Spring实战>第四版了,章节安排与之前不同了,里面应用的应该是最新的技术. 本章中,将会接触到Spring MVC基础,以及如何编写控制器来处理web请求,如何通明地绑定请求参数到业务对象上,同时还可以提供数据校验和错误处理的功能. Spring MVC初探 跟踪Spring MVC请求 在请求离开浏览器时,会带有用户所请求内容的信息,例如请求的URL.用户提交的表单信息. 请求旅

[老老实实学WCF] 第七篇 会话

老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高效.稳定和安全. 首先我们来学习会话. 1. 什么是会话 会话是通信双方进行通信的一个时间片.一个语境或者说一个上下文,在这个特定的环境中,通信的双方是彼此认识的,就像两个人在聊天,他们都很清楚谁在聆听自己讲话,也很清楚对方讲的话是给自己听的,简单的说就是通信双方是可以记住彼此的. 一旦会话结束了,

第五章 Flask——实例化Flask的参数及对app的配置

第五章 Flask--实例化Flask的参数及对app的配置 一.Flask中的实例化配置 二.Flask中的对象配置 一.Flask中的实例化配置 比如控制模板文件夹名字 from flask import Flask,render_template app = Flask(__name__,template_folder="templates") 那么实例化配置总共有哪些字段呢 static_folder = 'static', # 静态文件目录的路径 默认当前项目中的static

[书籍翻译] 《JavaScript并发编程》第五章 使用Web Workers

本文是我翻译<JavaScript Concurrency>书籍的第五章 使用Web Workers,该书主要以Promises.Generator.Web workers等技术来讲解JavaScript并发编程方面的实践. 完整书籍翻译地址:https://github.com/yzsunlei/javascript_concurrency_translation .由于能力有限,肯定存在翻译不清楚甚至翻译错误的地方,欢迎朋友们提issue指出,感谢. Web workers在Web浏览器中

深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

今天是六.一儿童节,祝小朋友们节日快乐!发完此文就带我家小朋友出去玩耍了. 第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中,并将数据发送到Zabbix server,这在无法安装Zabbixagent等程序的场景(例如专用的嵌入式系统)中非常有用.你也可以利用Zabbix API开发自己的业务系统,或灵活的与现有系统整合集成. 15.1 Zabb