2012-09-18 8 views
5

Ho due metodi in un servizio WCF direvariabile globale tra due metodi WCF

Method1() 
{ 
_currentValue = 10; 
} 

Method2() 
{ 
return _currentValue; 
} 

Ho una situazione in cui, ho bisogno di impostare un valore in Method1() e leggere in Method2().

Ho provato a utilizzare static variabile come public static int _currentValue, potrei leggere il valore impostato in Method1() in Method2().

Ma il problema è che voglio che questa variabile reagisca come una variabile di istanza separata per ogni richiesta effettuata. Per esempio, ora sotto è il problema

Browser 1:

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

Browser 2:

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

realtà il valore impostato è Browser 1 è statico, così nel browser 2 lo stesso valore è stato recuperato.

Quello che sto cercando di implementare è che la variabile dovrebbe comportarsi come una nuova istanza per ogni richiesta effettuata (quando si chiama da ciascun browser). Cosa dovrei usare in questo caso? una sessione?

+0

perché deve essere 'statico'? –

+0

non ha bisogno di essere, sto cercando di avere una variabile che è accessibile tra due metodi wcf .. dovrei usare qualche altro concetto come la sessione? – balanv

+0

sì - penso che tu voglia un'istanza per sessione. –

risposta

3

Avrai bisogno di un meccanismo di correlazione perché hai due sessioni completamente diverse che chiamano in metodi diversi. Quindi consiglierei di usare una chiave privata conosciuta da entrambi i chiamanti.

È un po 'impossibile per me sapere quale chiave può essere perché non riesco a raccogliere nulla dalla tua domanda, quindi solo tu lo sai, ma il semplice fatto è che avrai bisogno di correlazione. Ora, una volta determinato ciò che possono usare, puoi fare qualcosa di simile.

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

Hai creato la tua variabile static, e questo è ciò che sta causando il problema. static significa che ogni istanza della classe condivide la variabile, ma tutti si ha realmente bisogno è una variabile dichiarata al di fuori dei tuoi metodi, come questo:

private int _currentValue; 

Method1() 
{ 
    _currentValue = 10; 
} 

Method2() 
{ 
    return _currentValue; 
} 

Questa variabile sarà reated separatamente per ogni istanza della classe - la conservazione questo valore tra le richieste per un determinato utente è un problema separato. (Una sessione è una soluzione possibile.)

3

suona come potrebbe essere necessario utilizzare la modalità contesto un'istanza per sessione per il servizio WCF. Ciò ti consentirà di mantenere lo stato per sessione, in modo che le variabili membro nell'istanza del servizio rimangano tra le chiamate di metodo dalla stessa istanza proxy. Poiché ogni utente ha una propria sessione, lo stato dell'istanza del servizio varia a seconda dell'utente.

Dai un'occhiata a questo articolo per ulteriori informazioni: http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2

0

sembra un vecchio thread, ma nel caso in cui qualcuno è ancora interessato, questo può essere ottenuto solo chiedendo WCF per eseguire una singola istanza del vostro servizio. Aggiungere la seguente riga (decoratore) per la definizione della classe [ServiceBehavior (InstanceContextMode = InstanceContextMode.Single)]

Se si desidera che il comportamento solo per la stessa sessione, ma non tra i clienti, allora si può contrassegnare come per sessione dal seguente comportamento di servizio [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)]

L'altra opzione è per chiamata che è l'opzione predefinita. [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)]