2013-07-25 80 views
8

在會話持續我有一個會話的WCF服務所需靜態變量在WCF服務

[ServiceContract(SessionMode = SessionMode.Required) ] 

和一些靜態字段。我認爲通過進行會話,每個會話的靜態字段將保持不變,但爲不同會話創建新實例。但是,當我有兩個不同的客戶端使用該服務時,我所看到的是當一個客戶端更改字段的值時,此更改也會影響另一個客戶端。這是不同會話的正常行爲嗎?或者你認爲我的服務甚至可能不會創建不同的會話?

我正在使用netTCPbinding。

回答

3

靜態字段在應用程序的生命週期中是全局的。所以不同的客戶端看到相同的靜態變量。如果你想爲每個客戶端設置「靜態變量」,那麼你將不得不在其用戶的會話狀態中存儲它(我不太瞭解WCF,所以我不知道WCF的背景下究竟意味着什麼)

9

靜態變量在整個過程中共享,因此您看到的行爲。但是,如果您設置了服務的instance context mode to per-session,那麼將會爲每個會話創建該服務實例以及其(非靜態)變量。因此,這裏somevar是唯一的會話:

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

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

但是如果服務在同一個客戶端中被多次實例化呢? somevar會被重置,還是會對整個會話中的任何實例具有相同的值? – Orch

+0

@Orch這是一個很好的問題 - 我相信這將是後者。會話基於URL中的cookie或標記,即使實例化新客戶端也應該保持不變。換句話說,WCF足夠聰明,只能實例化一個服務實例。 – McGarnagle

+0

好吧,我會試試看。希望它有效! – Orch

2

一個靜態變量的作用域是應用領域,這是一個應用程序域加載一次,因爲你的實際類型(從中創建實例類)等等都所有與它相關的靜態變量和方法。因此,即使您有多個實例或服務的單個實例,它們也會共享靜態變量。