【问题标题】:What is the purpose of using session in WCF在 WCF 中使用 session 的目的是什么
【发布时间】:2014-01-31 11:24:42
【问题描述】:

我读了一篇文章,他们说WCF does support sessions yes; but they are not like ASP.NET sessions. Sessions are there to deliver messages in order

所以我不明白会话在 wcf 中的作用。在 asp.net 中,许多人对用户进行身份验证并在会话中存储一些值,然后检查每个安全页面访问该值是否在该会话变量中可用?

如果没有,则将用户重定向到登录页面。但我想了解 wcf 中的会话是什么?如果会话没有在 wcf 中启用,那将是不可能的。

请用小例子解释一下,结果我能理解。谢谢

【问题讨论】:

    标签: wcf session


    【解决方案1】:

    WCF 会话和 ASP.Net 会话状态之间几乎没有共同点 - MSDN 中清楚地突出了差异。基本上,ASP.Net 会话围绕着识别用户与网站的交互,并允许存储与此用户会话相关联的Session State

    WCF 会话跨多个调用保留状态,例如服务器将能够使用来自同一会话的先前方法调用的状态信息恢复会话。 WCF 会话中的状态没有开箱即用的持久性,通常,WCF 会话的持续时间比 ASP.Net 会话短。

    在 Session 期间调用的 WCF Session 方法可能需要按特定顺序(IsInitiatingIsTerminating)。

    计算器的例子很好:

    [ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
    public interface ICalculatorSession
    {
        [OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
        void Clear();
        [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
        void AddTo(double n);
        [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
        void SubtractFrom(double n);
        [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
        void MultiplyBy(double n);
        [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
        void DivideBy(double n);
        [OperationContract(IsInitiating = false, IsTerminating = true)]
        double Equals();
    }
    

    从上面的界面:

    • 客户端必须通过调用 Clear() 来启动会话(即,在调用此方法之前它无法开始进行任何计算)
    • 然后客户端可以调用任意数量的DivideByMultiplyBySubtractFromAddTo 方法。在任何时候,服务器都会记住之前的状态,即之前计算的结果,就像计算器中的寄存器一样。
    • 客户端调用Equals得到最终结果,也结束了Session。

    编辑 我已经上传了一个示例到 GitHub 这里,带有客户端和服务器位,用于 VS2010。

    【讨论】:

    • 感谢您的回答。你能给我一个小代码来证明服务可以记住会话启用时先前状态的结果吗?
    • 当 session 没有实现时 IsInitiating = false, IsTerminating = true 这些属性有意义吗?
    • (编辑)AFAIK 属性 IsInitiating 和 IsTerminating 是没有意义的,除非与 SessionMode=SessionMode.Required / Allowed 和基于会话的绑定一起使用。代码示例 - 我会看看我能做什么。
    • 谢谢....请提供代码示例,证明服务可以在启用会话时记住先前状态的结果。
    • 我已将样本上传至Github。主要服务实现是here。请注意需要启用会话的绑定,例如 wsHttpBinding
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    相关资源
    最近更新 更多