WCF SessionMode.Required和PerCall

时间:2015-07-09 12:26:44

标签: wcf

当我设置SessionMode = SessionMode.Required和InstanceContextMode = InstanceContextMode.PerCall然后会话存在并且每次我调用方法然后创建新实例但是也创建新会话?基于this,answear是肯定的

  

会话频道的行为:每次通话的会话和InstanceContext。

我创建了简单的应用并设置了

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
[ServiceContract(CallbackContract = typeof(IRepairCallbackContract), SessionMode = SessionMode.Required)]

我正在展示

        Debug.WriteLine(Counter + "" + OperationContext.Current.SessionId);
        Counter += 1;

事实证明,Counter总是等于1(默认值),并且会话总是相同的,这意味着会话被保留,与msdn中的内容相对应。

因为我正在阅读编程WCF服务,第3版而感到困惑,并且有声明:

  

如果为每个呼叫实例化配置了服务,则仍然可以有传输会话,但是对于每个呼叫,WCF将创建仅用于该呼叫的新上下文。

1 个答案:

答案 0 :(得分:1)

msdn文章可能写得不好。你可以将句子解释为

  

每次通话和会话的InstanceContext。

或者它可能是完全错误的,或者在原始编写时更正并逐字复制到更新版本的.net。

无论哪种情况,我都会说你最终证明了这种行为是跨越通话的一致会话,我必须说这是一个令人惊讶的结果。它实际上可能是缺陷或预期的行为。

在某种程度上,如果通道是sessionfull,那么WCF堆栈中的某些机器会识别这一点,尽管每次调用都会更新实例。我的意思是,单个呼叫会话的重点是什么?

这也可能与您定义双工通道的事实有关。我会重复测试而不定义回调合同以确认结果。