使用instanceContextMode = PerSession创建wcf Web服务

时间:2012-12-07 16:12:57

标签: c# wcf web-services persistence

我的服务非常简单:

[ServiceContract]    
public interface IPncService
{
    [System.ServiceModel.Web.WebGet(UriTemplate = "set/{val}")]
    [OperationContract]
    bool SetVariable(string val);

    [System.ServiceModel.Web.WebGet(UriTemplate = "get")]
    [OperationContract]
    string GetVariableVal();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class PncService : IPncService
{
    string someVariable;

    public bool SetVariable(string val)
    {
        if (string.IsNullOrWhiteSpace(val))
            return false;
        else
        {
            someVariable = val;
            return true;
        }            
    }

    public string GetVariableVal() {
        return someVariable;
    }
}

为什么变量someVariable不会保留每个会话的值?

换句话说,如果我这样做:

enter image description here

然后转到:

enter image description here

为什么someVariable = null的价值?这是一次不同的会议吗?我在调用set方法后立即在同一个浏览器上调用该方法...

1 个答案:

答案 0 :(得分:3)

您应该阅读本文:http://blogs.msdn.com/b/wenlong/archive/2010/02/21/using-asp-net-sessions-from-wcf.aspx

简短版本:

  

WCF会话与ASP.NET会话非常不同。简而言之,

     
      
  • WCF会话表示为服务实例(作为CLR对象),状态是每个服务实例的一部分。会议是   由调用的WCF客户端发起。 WCF依赖于特殊的上下文   提供会话的相关性:会话通道,安全   对话,可靠消息等。
  •   
  • ASP.NET会话就像跨不同请求的共享数据存储。会话始终由服务器启动。 ASP.NET   依赖于cookie或特殊的Uri goo来提供相关性   会话。
  •   

因此:

  

启用会话状态启用会话状态非常简单   ASP.NET会话状态。您只需要在中运行WCF服务   ASP.NET兼容模式在web.config中指定: