我的服务非常简单:
[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方法后立即在同一个浏览器上调用该方法...
答案 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中指定: