我在WCF服务中有两个方法说
Method1()
{
_currentValue = 10;
}
Method2()
{
return _currentValue;
}
我遇到一种情况,我需要在方法1()中设置一个值并在方法2()中读取它。
我尝试使用static
像 public static int _currentValue
这样的变量,我可以在 Method1() 中读取在 Method2() 中设置的值。
但问题是,我希望这个变量像每个请求的单独实例变量一样做出反应。 即,现在下面是问题
浏览器 1 :
- Method1() is called
=> sets _currentValue = 10;
- Method2() is called
=> returns _currentValue = 10;
浏览器 2:
- Method2() is called
=> returns _currentValue = 10;
实际上设置的值是浏览器 1 是静态的,所以在浏览器 2 中检索相同的值。
我试图实现的是,对于发出的每个请求(从每个浏览器调用时),变量应该像一个新实例一样。在这种情况下,我应该使用什么?会话?
您将需要一些关联机制,因为您有两个完全不同的会话调用不同的方法。 因此,我建议使用两个调用者都知道的私钥。
我有点不可能知道这个关键是什么,因为我无法从你的问题中收集任何东西,所以只有你知道,但简单的事实是你需要相关性。现在,一旦你确定了他们可以使用什么,你就可以做这样的事情。
public class SessionState
{
private Dictionary<string, int> Cache { get; set; }
public SessionState()
{
this.Cache = new Dictionary<string, int>();
}
public void SetCachedValue(string key, int val)
{
if (!this.Cache.ContainsKey(key))
{
this.Cache.Add(key, val);
}
else
{
this.Cache[key] = val;
}
}
public int GetCachedValue(string key)
{
if (!this.Cache.ContainsKey(key))
{
return -1;
}
return this.Cache[key];
}
}
public class Service1
{
private static sessionState = new SessionState();
public void Method1(string privateKey)
{
sessionState.SetCachedValue(privateKey, {some integer value});
}
public int Method2(string privateKey)
{
return sessionState.GetCachedValue(privateKey);
}
}
对 WCF 服务使用每会话实例上下文模式。 这将允许您基于每个会话维护状态,因此服务实例中的成员变量将在来自同一代理实例的方法调用之间保留。 由于每个用户都有自己的会话,因此服务实例的状态因用户而异。
查看这篇文章了解更多信息:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2
你已经使变量static
,这就是导致问题的原因。 static
意味着类的每个实例都共享该变量,但您真正需要的只是在方法外部声明的变量,如下所示:
private int _currentValue;
Method1()
{
_currentValue = 10;
}
Method2()
{
return _currentValue;
}
此变量将针对类的每个实例单独重新分配 - 在给定用户的请求之间保留此值是一个单独的问题。 (会话是一种可能的解决方案。
WCF 提供了三种控制 WCF 服务实例的方法:
- 每次调用
- 珀塞斯
- 单个实例
您将通过阅读本文找到最佳解决方案
执行 WCF 实例管理的三种方法
是一个旧线程,但如果有人仍然感兴趣,这可以通过要求 WCF 运行服务的单个实例来实现。将以下行(装饰器)添加到类的定义中[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
如果希望行为仅针对同一会话,而不是跨客户端,则可以通过以下服务行为将其标记为每个会话[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
另一个选项是每个调用,这是默认选项。[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]