会话在分布式应用程序中广泛用于维护每个用户的状态。在站点或者基于站点的应用中,将每个用户的状态存储于会话中很常见。这这些情况中,用户和会话间有一个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 会话敏感服务输出

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

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

    我们将在本章使用前一章中介绍的基本函数编写一个完整的TCP客户/服务器程序实例 这个简单得例子是执行如下步骤的一个回射服务器: TCP回射服务器程序 #include "unp.h" ...

  2. 《NodeJS开发指南》第五章微博实例开发总结

    所有文章搬运自我的个人主页:sheilasun.me <NodeJS开发指南>这本书用来NodeJS入门真是太好了,而且书的附录部分还讲到了闭包.this等JavaScript常用特性.第 ...

  3. 《NodeJs开发指南》第五章微博开发实例的中文乱码问题

    在<NodeJs开发指南>第五章,按照书中的要求写好微博实例后,运行代码,发现中文显示出现乱码,原因是:views文件夹下的ejs文件的编码格式不是utf-8. 解决方法:以记事本方式打开 ...

  4. 精通Web Analytics 2.0 (7) 第五章:荣耀之钥:度量成功

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第五章:荣耀之钥:度量成功 我们的分析师常常得不到我们应得的喜欢,尊重和资金,因为我们没有充分地衡量一个黄金概念:成果.因为我们 ...

  5. [Effective Java]第五章 泛型

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

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

    老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...

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

    老老实实学WCF 第五篇 再探通信--ClientBase 在上一篇中,我们抛开了服务引用和元数据交换,在客户端中手动添加了元数据代码,并利用通道工厂ChannelFactory<>类创 ...

  8. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  9. .Net 如何模拟会话级别的信号量,对http接口调用频率进行限制(有demo)

    现在,因为种种因素,你必须对一个请求或者方法进行频率上的访问限制. 比如, 你对外提供了一个API接口,注册用户每秒钟最多可以调用100次,非注册用户每秒钟最多可以调用10次. 比如, 有一个非常吃服 ...

随机推荐

  1. OpenJudge 2979 陪审团的人选 / Poj 1015 Jury Compromise

    1.链接地址: http://bailian.openjudge.cn/practice/2979 http://poj.org/problem?id=1015 2.题目: 总Time Limit: ...

  2. mysql 删除日志

    mysql日志过大,想用rm 删除掉,后来想一下,是不是有别的方法,搜索一下,果然有..... mysql > PURGE MASTER LOGS BEFORE '2014-03-16 00:0 ...

  3. JavaScript 对象的几种创建方法

    /** * Created by 2016 on 2016/6/4. */ function Box(){ var obj = new obj(); obj.name = "Lee" ...

  4. (转)web.config 为某个单独页面设置编码格式

    原文链接:http://www.cnblogs.com/mytechblog/articles/1937407.html 全站应用utf-8格式,在web.config里的<system.web ...

  5. css中>,+,~的用法

    1.>的用法 A>B选择A的所有子元素B(只选择一代) 2.+的用法 A+B选择紧随着A的兄弟元素B 3.~的用法 A~B选择位置处于A后面的所有兄弟元素B(不包含兄弟元素的子元素)

  6. A-Frame 简介03

    如果你想开始使用A-Frame可以通过以下几种方式: Play with CodePen Grab the Boilerplate Include the JS Build Install from ...

  7. err: exp-00056 rra-12154 exp-00000

    一直用的是win7系统+oracle11g r1 server端(后简称r1). 由于工作需要装了oracle11g r2 client端(后简称r2). 在装r2之前,r1的导出exp是没有问题的. ...

  8. linux磁盘设备知识

    linux分区数字编号: 1.分区数字编号1至4留给主分区或扩展分区使用,逻辑分区编号从5开始. 2.IDE硬盘设备名均以/dev/hd开头,不同硬盘编号依次是/dev/hda/./dev/hdb./ ...

  9. NGUI系列教程四(自定义Atlas,Font)

    今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...

  10. 常用的四种CSS样式表格

    1. 单像素边框CSS表格 这是一个很常用的表格样式. [html] <style type="text/css"> table.gridtable { font-fa ...