2010-10-13 86 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