2013-07-25 15 views
8

Ho un servizio WCF con sedute necessarievariabili statiche persistenti tra le sessioni in servizio WCF

[ServiceContract(SessionMode = SessionMode.Required) ] 

e alcuni campi statici. Ho pensato che avendo sessioni, i campi statici sarebbero rimasti gli stessi per ogni sessione, ma hanno nuove istanze per sessioni diverse. Tuttavia, quello che vedo quando utilizzo due client diversi è che quando un client modifica il valore di un campo, questa modifica influisce anche sull'altro client. Questo comportamento normale ha diverse sessioni? O pensi che il mio servizio potrebbe anche non creare sessioni diverse?

Sto usando netTCPbinding.

risposta

3

Il campo statico è globale per la durata dell'applicazione. Quindi i clienti diversi vedono la stessa variabile statica. Se si desidera la 'variabile statica' per ciascun client, è necessario memorizzarlo in qualsiasi punto dello stato sessione dell'utente (non conosco bene la WCF, quindi non so cosa significhi esattamente nel contesto di WCF)

9

Le variabili statiche sono condivise in tutto il processo, quindi il comportamento che si vede. Ma se imposti il ​​servizio instance context mode to per-session, allora quell'istanza del servizio verrà creata per sessione, insieme alle sue variabili (non statiche). Così qui somevar è unico per la sessione:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class Service : IService 
{ 
    private string sessionVariable;   // separate for each session 

    private static string globalVariable; // shared across all sessions 
} 
+0

E se il servizio viene istanziato più volte nello stesso client? Qualcuno potrebbe reimpostare o avrebbe lo stesso valore per qualsiasi istanza nella sessione? – Orch

+0

@Orch questa è una buona domanda - credo che sarebbe il secondo. La sessione si basa su un cookie o un token nell'URL, che dovrebbe rimanere uguale anche se viene creato un nuovo client. In altre parole, WCF è abbastanza intelligente da istanziare solo un'istanza di servizio. – McGarnagle

+0

Ok, ci provo. Spero che funzioni! – Orch

2

Ambito di una variabile statica è Application Domain, questo è perché il vostro tipo effettivo (classe da cui vengono create le istanze) viene caricato una volta in un dominio di applicazione, e così sono tutte le sue variabili statiche e metodi ad esso associati. Quindi, anche se hai più istanze o una singola istanza di un servizio, condivideranno la variabile statica.

Problemi correlati