2012-09-18 245 views
5

我有一个WCF服务的两种方法说全局变量

Method1() 
{ 
_currentValue = 10; 
} 

Method2() 
{ 
return _currentValue; 
} 

我在这情况下,我需要设置方法一(值),并在方法2阅读()。

我试过使用static变量,如public static int _currentValue,我可以读取Method2()中Method1()中设置的值。

但问题是,我希望这个变量对每个请求作出独立的实例变量反应。也就是说,现在下面的问题是

浏览器1:

- Method1() is called 
    => sets _currentValue = 10; 
- Method2() is called 
    => returns _currentValue = 10; 

浏览器2:

- Method2() is called 
    => returns _currentValue = 10; 

其实值设定为浏览器1是静态的,所以在浏览器2 检索到相同的值。

我想实现的是变量应该为每个请求(从每个浏览器调用时)作为新实例。我应该在这种情况下使用什么?会议?

+0

为什么它必须是'static'? –

+0

它不需要,我想有一个变量,可以在两个wcf方法之间访问..我应该使用一些其他的概念,如会话? – balanv

+0

是的 - 我想你想每个会话的实例。 –

回答

3

您将需要一些相关机制,因为您有两个完全不同的会话调用不同的方法。所以我会建议使用这两个呼叫者都知道的私钥。

我有点不可能知道那个键是什么,因为我不能真正收集你问题中的任何东西,所以只有你知道这一点,但简单的事实是你需要相关性。现在,一旦你确定他们可以使用什么,你可以做这样的事情。

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); 
    } 
} 
2

您已使您的变量static,这是什么导致的问题。 static意味着你的类的每个实例共享变量,但你真正需要的是你的方法以外声明的变量,就像这样:

private int _currentValue; 

Method1() 
{ 
    _currentValue = 10; 
} 

Method2() 
{ 
    return _currentValue; 
} 

这个变量将分别为您的类的每个实例reated - 保给定用户的请求之间的这个值是一个单独的问题。 (会话是一种可能的解决方案。)

3

听起来好像您可能需要为WCF服务使用每会话实例上下文模式。这将允许您保持每个会话的状态,因此服务实例中的成员变量将在来自同一个代理实例的方法调用之间持续存在。因为每个用户都有自己的会话,所以服务实例的状态会因用户而异。

退房本文的详细信息:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2

0

看起来像一个古老的线程,但如果有人仍然有兴趣,这可以通过只要求WCF运行服务的单个实例来实现。以下行(装饰)添加到您的类的定义 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

如果你想只对同一个会话,但不能跨客户的行为,你可以将其标记为每个会话通过以下服务行为 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]

另一个选项是每个呼叫,这是默认选项。 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]