2010-10-13 56 views
1

我有一個WCF應用程序,具有多個WSDL Web服務,託管在Windows Server 2008 64位的IIS7中。IIS7中的WCF應用程序:丟失單例實例

當第一個webservice方法被調用時(無論首先調用什麼),應用程序需要爲單例分配一次配置值。

編輯:系統的後端需要使用這種單例方法。

我得到一次分配的配置,但值空再次成爲....

下面是代碼(簡化):

public class SingletonSettings 
{ 
    private static readonly SingletonSettings _s; 

    public SingletonSettings Instance { get {return _s;} } 

    public object SomeValue { get; set; } 
} 

public abstract class AbstractWebservice 
{ 
    static AbstractWebservice() 
    { 
     WebserviceGlobalInitializer.Initialize(); 
    } 

} 
//Just a webservice 
public class Webservice1 : AbstractWebservice, ISomeServiceConctract1 
{ 
    public void DoStuff1(); 
} 

//Just a webservice 
public class Webservice2 : AbstractWebservice, ISomeServiceConctract2 
{ 
    public void DoStuff2(); 
} 

internal class WebserviceGlobalInitializer 
    { 
     private static readonly object Lock = new object(); 
     private static bool Initialized = false; 

     public static void Initialize() 
     { 
      lock (Lock) 
      { 
       if (!Initialized) 
       { 
        InitStuff(); 

        Initialized = true; 
       } 
      } 
     } 

     private static void InitStuff() 
     {    
      string s = SingletonSettings.Instance.SomeValue = "just a ref"; 
     } 
    } 

WebserviceGlobalInitializer.InitStuff()被調用一次。仍然SingletonSettings.SomeValue變爲空.....

該問題是隨機發生的。

我試圖

1)從在基類的一個正常的構造調用WebserviceGlobalInitializer.Initialize()

2)註釋掉:Initialized = true;在希望的設置將被每次初始化(造成巨大的開銷,所以它不會是反正一個長期的解決方案)

仍值變爲零。

任何想法?

回答

1

經過幾天的搜索後,我發現問題的根源。 Aliostad的回答給了我一個提示。

我的web服務使用行爲配置。一個有身份驗證,一個沒有。 驗證/會話處理在加載webservice之前調用的IDispatchMessageInspector中實現。

當應用程序池被回收時,使用我的webservice的應用程序處於聯機狀態時發生問題。然後,應用程序會使用經過身份驗證的行爲向Web服務發出請求。 的IDispatchMessageInspector FPGA實現然後會試圖加載設置,但它們尚未從web服務的靜態構造函數初始化....

謝謝你的答案...

0

您可以使用WCF運行時基礎架構爲您處理此問題。嘗試添加下面的屬性到WebService類:

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

1

隨着進程回收,這不是在會話狀態或應用程序狀態的所有國家將消失在黑洞。這讓人大開眼界,包含了靜態變量,其中一個是單例實例。

我的直覺是單例的InstanceContextMode已經作爲ASP.NET應用程序狀態中的變量實現。要檢查這一點,我今天會做一些反思,並會更新我的答案。

UPDATE

沒有也!通過進程回收,即使您將WCF實例化模式設置爲Single,也會失去使用進程回收的單例實例(例如計數器,無論)的所有狀態。

+0

只要我鬆它一下子就可以了。我用手動按回收測試並沒有中斷。 :-( – Fedearne 2010-10-13 13:03:00