【问题标题】:WCF SessionMode.Required and PerCallWCF SessionMode.Required 和 PerCall
【发布时间】:2015-07-09 21:04:04
【问题描述】:

当我设置 SessionMode = SessionMode.Required 和 InstanceContextMode=InstanceContextMode.PerCall 时,会话存在,每次我调用方法时都会创建新实例,但是否也创建了新会话?基于this,答案是肯定的

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

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

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

我正在展示

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

事实证明,Counter 始终等于 1(默认)并且 session 始终相同,因此这意味着 session 与 msdn 中所说的相反。

我在阅读Programming WCF Services, 3rd Edition时感到困惑,并且有声明:

如果服务被配置为每次调用实例化,仍然可以有一个传输会话,但对于每个调用,WCF 都会创建仅用于该调用的新上下文。

【问题讨论】:

    标签: wcf


    【解决方案1】:

    msdn 文章有可能只是写得不好。您可以将句子解释为

    每个调用的 InstanceContext 和一个会话。

    或者它可能是完全错误的,或者在最初写作时是正确的,并逐字复制到较新版本的 .net 中。

    不管怎样,我想说的是,您已经最终证明了这种行为是跨呼叫的一致会话,我必须说这是一个令人惊讶的结果。它实际上可能是一个缺陷,或预期的行为。

    从某种意义上说,如果通道是会话满的,那么 WCF 堆栈中的某些机器会识别这一点,尽管每次调用都会更新实例。我的意思是,单次通话的意义何在?

    这也可能与您定义了双工通道有关。我会重复测试而不定义回调合约来确认结果。

    【讨论】:

    • 有 CallbackContract 和没有它的结果是等价的。
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多