2012-02-27 55 views
0

背景:如何在WCF中的進程間共享靜態對象?

我問this question關於我的WCF服務創建緩存提供商結構。我現在已經實現了這個設計,但是我在測試中注意到的是提供者實際上並沒有被緩存。我怎麼知道這個?我添加以下調試級別日誌記錄我的服務:

private static readonly IDictionary<string, XmlLoaderProviderBase> _providerDictionary = 
    new Dictionary<string, XmlLoaderProviderBase>(); 

public void Load(LoadRequest loadRequest) 
{ 
    XmlLoaderProviderBase xmlLoader; 
    if (_providerDictionary.ContainsKey(loadRequest.TransferTypeCode)) 
    { 
     // Use cached provider... 
     xmlLoader = _providerDictionary[loadRequest.TransferTypeCode]; 

     Logger.Log.DebugFormat("Found cached provider: {0} for transfer type: {1}", 
      xmlLoader.GetType(), loadRequest.TransferTypeCode); 
    } 
    else 
    { 
     // Instantiate provider for the first time; add provider to cache... 
     xmlLoader = XmlLoaderProviderFactory.CreateProvider(loadRequest.TransferTypeCode); 
     _providerDictionary.Add(loadRequest.TransferTypeCode, xmlLoader); 

     Logger.Log.DebugFormat("Instantiating provider: {0} for transfer type: {1}", 
      xmlLoader.GetType(), loadRequest.TransferTypeCode); 
    } 
    xmlLoader.Load(loadRequest); 
} 

我注意什麼,就是不管多少次,我呼叫服務,提供者總是實例化(它永遠不會找到緩存的版本)。幸運的是,log4net是非常有用的,它顯示每個對服務的調用運行在它自己獨特的進程中(即它有一個唯一的進程ID)。因此,提供者將永遠不會被緩存。我如何才能實際緩存提供程序,並跨進程讀取該字典?這甚至有可能嗎?

我也讀上如此相似問題,這在這裏,我注意到InstanceContextMode設置。我不認爲我想要這樣做,因爲我認爲這會損害性能(我錯了嗎?)在堅果殼中,我希望跨越所有進程/服務實例共享所有進程/服務實例...請幫助!

+0

WCF服務呼叫做_not_運行在單獨的進程。 – 2012-02-27 16:28:12

+0

沒有靜態物體這樣的東西。您可以擁有靜態類和靜態成員 – 2012-02-27 16:39:21

+0

@JohnSaunders - 我會以一美元購買它,但有幾件事情:1)連續調用服務時每次顯示不同的PID,以及2)檢查以查看如果提供者已經存在,則從未評估爲真。謹慎地闡述你的立場,併爲我提供更多的見解嗎? – Didaxis 2012-02-27 16:45:20

回答

0

我要偷@ slfan的評論:

使用

[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode=InstanceContextMode.Single)] 

默認InstanceContextMode是PerSession。

相關問題