在标题中我加了一个大家都很熟悉的单词——Session,熟吧?玩过Web开发的朋友肯定在梦中都会见到她。
在Web中为什么要会话呢?毕竟每个用户在一个Web应用中可能不止进行一次操作,比如,某二手飞机交易网站,用户A登陆后,可能他会修改他的个人信息,他也有可能看好了一架二手飞机,打算入手,就把商品放到他的“购物车”中,这些过程中,都会产生许多与用户A相关的数据,这些数据只是对A有效,而当用户B登陆后,对于B,又会有他自己的数据,总的一句话就是,每个客户端在服务器上都有其的独立数据存储区,互不相干,就好像A和服务器在单独谈话一样,所以叫会话。
在WCF中,会话的含义与Web中的会话概念是差不多的,就是客户端与服务器端在“私聊”,这便是存在会话的调用;那么,没有会话的调用呢,就是“群聊”;通信过程中,数据都以明文显示,不进行加密保护,这叫“裸聊”。
好了,现在大家对于会话,肯定有点理解了。但是,会话是看不见摸不着的,怎么通过实例来检验它呢?
下面,我们写一个例子,看看在不支持会话的绑定上连续调用两个有关联的代码,会发生什么情况。
[ServiceContract]
public interface IService
{
[OperationContract(IsOneWay = true)]
void SetValue(int n);
[OperationContract]
int GetValue();
}
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyService : IService
{
public MyService()
{
Console.WriteLine("-------------------------------");
Console.WriteLine("{0} - 服务被实例化。",DateTime.Now.ToLongTimeString());
}
// 在析构函数中也输出信息
~MyService()
{
Console.WriteLine("{0} - 服务实例被释放。", DateTime.Now.ToLongTimeString());
Console.WriteLine("--------------------------------");
}
/// <summary>
/// 私有字段
/// </summary>
private int m_Value = int.MinValue;
public void SetValue(int n)
{
this.m_Value = n;
Console.WriteLine("会话ID:{0}", OperationContext.Current.SessionId);
}
public int GetValue()
{
Console.WriteLine("会话ID:{0}", OperationContext.Current.SessionId);
return this.m_Value;