2012-09-18 276 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)]