2013-07-25 9 views
8

Mam usługa WCF sesje wymaganeZmienne statyczne trwające między sesjami w usług WCF

[ServiceContract(SessionMode = SessionMode.Required) ] 

a niektóre pola statyczne. Sądziłem, że dzięki sesjom statyczne pola pozostaną takie same dla każdej sesji, ale będą miały nowe instancje dla różnych sesji. Jednak to, co widzę, gdy mam dwóch różnych klientów korzysta z usługi, polega na tym, że gdy jeden klient zmienia wartość pola, ta zmiana dotyczy także drugiego klienta. Czy to normalne zachowanie podczas różnych sesji? A może uważasz, że moja usługa może nie tworzyć nawet różnych sesji?

Używam netTCPbinding.

Odpowiedz

3

Pole statyczne ma charakter globalny przez cały okres użytkowania aplikacji. Tak więc różni klienci widzą tę samą zmienną statyczną. Jeśli chcesz "zmienną statyczną" dla każdego klienta, musisz przechowywać ją gdzieś w stanie sesji tego użytkownika (nie znam dobrze WCF, więc nie wiem, co to oznacza dokładnie w kontekście WCF).

9

Zmienne statyczne są udostępniane w całym procesie, stąd obserwowane zachowanie. Ale jeśli ustawisz usługę instance context mode to per-session, ta instancja usługi zostanie utworzona na sesję wraz ze swoimi (niestatycznymi) zmiennymi. Więc tutaj somevar jest unikatowy dla sesji:

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

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

Ale co, jeśli usługa jest tworzona więcej niż jeden raz w tym samym kliencie? Czy somevar zostanie zresetowany lub czy będzie miał tę samą wartość dla wszystkich instancji w całej sesji? – Orch

+0

@Orch to dobre pytanie - wierzę, że to będzie drugie. Sesja jest oparta na pliku cookie lub tokena w adresie URL, który powinien pozostać taki sam, nawet jeśli zostanie utworzony nowy klient. Innymi słowy, funkcja WCF jest wystarczająco inteligentna, aby utworzyć tylko instancję jednej usługi. – McGarnagle

+0

Dobra, spróbuję. Mam nadzieję, że to działa! – Orch

2

Zakres zmiennej statycznej Zastosowanie domeny, to dlatego, że rzeczywisty typ (klasa, z której tworzone są instancje) jest ładowany raz w domenie aplikacji, a więc są wszystkie jego zmienne statyczne i metody z nim związane. Więc nawet jeśli masz wiele instancji lub pojedyncze wystąpienie usługi, będą one udostępniać zmienną statyczną.