会话在分布式应用程序中广泛用于维护每个用户的状态。在站点或者基于站点的应用中,将每个用户的状态存储于会话中很常见。这这些情况中,用户和会话间有一个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. WCF 第五章 并发和实例(服务行为)

    并发是一个多少个任务可以同时执行的度量,以任务(请求,工作,事务,以及类似的)的形式度量.执行时间是一个任务多长时间完成的度量,以时间(毫秒,秒,其他的时间单位等)度量.吞吐量是在一个指定时间里可以完 ...

  2. WCF 第五章 控制并发调用的数量

    当InstancingMode设置成Single时,WCF在宿主内创建一个单一的实 例,不考虑有多少客户端被创建.当ConcurrencyMode设置成Multiple时,WCF为每个请求创建一个线程 ...

  3. WCF 第五章 行为 事务之选择一个事务协议-OleTx 或者WS-AT

    事务管理器负责协调多个部分间的工作并通过资源管理器提交工作.资源管理器负责处理可信赖,持续存储.取决于使用的资源和服务或应用跨越的边界,WCF将使用三个事务管理器中的一个来完成事务处理.轻量级事务管理 ...

  4. WCF 第五章 行为 实现自定义行为

    自定义行为可以在WCF创建运行时和消息处理管道时让你在重要的地方插入代码.行为可以添加到代码中,通过属性或配置文件手动实现服务描述.在所有的情况中,代码可以做一些辅助动作,比如在一个目录中寻找信息或者 ...

  5. WCF 第五章 行为 实现事务(操作行为)

    有两个场景一般用作事务的参考.多步骤商业过程是典型跨度分,天,月的长时间运行过程.它们可以涉及多个组织和基于人的工作流.短期运行事务是那些在几秒钟完成并很少有外部依赖的商业操作.尽管它们都有定义的很好 ...

  6. WCF 第五章 导出并发布元数据(服务行为)

    一个服务的ABCs-它的地址,绑定和契约-是以元数据的形式表示的以便于潜在的客户端知道到哪里,该如何与谁去通信.信息统称为服务元数据.服务行为元数据是大多数程序员遇到的第一个行为,因为当你创建WCF工 ...

  7. WCF 第五章 行为 以属性为服务操作行为暴露一个参数检测器

    列表5.24实现一个使用正则表达式验证参数的行为.它可以应用到任何操作上并允许开发人员定义一个正则表达式和当参数不合法时用来返回错误信息的消息. 代码显示了从一个操作行为调用的一个参数检测器并显示了实 ...

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

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

  9. 【Ogre编程入门与进阶】第十五章 Ogre的“二维”与合成特效

    15.1 Ogre中的"二维" 早在第一章,我们就曾经向读者介绍过,Ogre是一个3D图形渲染引擎,通过Ogre可以制作出各种各样的三维动画和游戏.但是,不要以为Ogre中只能渲染 ...

最新文章

  1. od结构体大小_od内存断点的探析和检测方法
  2. PHP5.5的一点变化
  3. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
  4. [渝粤教育] 江西外语外贸职业学院 商务英语翻译技巧 参考 资料
  5. 01 辅助函数之加密函数
  6. 【Python】Matplotlib绘制蓝天下的普通房屋
  7. php 跨域 验证_php 前后端分离开发进行跨域请求时ajax发送验证参数token的header头解决方法...
  8. 使用Python简单模拟Linux系统的tree工具
  9. python显示函数图像_python – 显示存储在函数中的图像
  10. win10软件安装出现错误代码2503/2502
  11. 思维导图让你掌握《有效沟通》
  12. 教你如何在Oracle官网免登陆下载oracle数据库以及相关工具
  13. JAVA输入任意一个数,判断是否是回文数
  14. 理解 Mach-O 并提高程序启动速度
  15. 阿啊-有意思的表情包
  16. Matlab自适应均线_matlab – 计算移动平均线
  17. 越来越注重手机拍照的时代,OPPO R11凭借哪些因素占领了市场?
  18. Simpsons’ Hidden Talents【KMP模板题】
  19. 某些函数改为了inline方式优化。开始写CCursor类。
  20. Like后面跟子查询

热门文章

  1. OpenAI逆炼以文生图:参数缩水2/3性能却更强,还get局部编辑新技能|可试玩
  2. 我用90年代的古董电脑训练CNN
  3. 千米感知误差低于5%,嬴彻发布全球领先的超长距精准3D感知技术
  4. 百度无人驾驶出租长沙开测:Apollo技术一汽红旗车队,年内服役
  5. 回京火车上编码是一种怎样的体验?
  6. openJDK之sun.misc.Unsafe类CAS底层实现
  7. Css常用操作——————分类
  8. 华为eNSP和SecureCRT连接乱码问题
  9. 教你怎样快速DIY自己的博客园SKIN
  10. fetch git pull 切换_每天提交 Git 太烦?直接用 Python 就好了!