0

我有一个非常简单的服务:

[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在每个会话中不保留其值?

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

在此处输入图像描述

然后转到:

在此处输入图像描述

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

4

1 回答 1

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 会话状态非常简单。您只需要在 web.config 中指定的 ASP.NET 兼容模式下运行 WCF 服务:

于 2012-12-07T16:20:19.800 回答