代码之家  ›  专栏  ›  技术社区  ›  Fedearne

iis7中的wcf应用程序:丢失singleton实例

  •  1
  • Fedearne  · 技术社区  · 14 年前

    我有一个带有多个WSDL Web服务的WCF应用程序,托管在WindowsServer2008 64位上的iis7中。

    当调用第一个WebService方法时(无论首先调用什么方法),应用程序要求为一个singleton分配一次一些配置值。

    编辑: 系统的后端需要使用这种单例方法。

    我得到配置分配一次,但是值再次变为空….

    以下是代码(简化):

    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; 希望每次都能初始化设置(这会导致大量的开销,因此无论如何也不是一个长期的解决方案)

    值仍然为空。

    有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Aliostad    14 年前

    工艺回收 所有不在会话状态或应用程序状态的状态都将消失在黑洞中。这一点,令人大开眼界,包括静态变量,其中一个是singleton实例。

    我的直觉是,singleton的instanceContextMode已经在ASP.NET应用程序状态中作为变量实现。为了检查这一点,我今天将做一些反思,并将更新我的答案。

    更新

    不,不!!!! 使用进程回收,即使将wcf实例模式设置为single,也会丢失进程回收的singleton实例(如counter等)的所有状态。

        2
  •  1
  •   Fedearne    14 年前

    经过几天的搜索,我找到了问题的根源。阿利奥斯塔德的回答给了我一个暗示。

    我的WebService使用行为配置。一个有认证,一个没有。 身份验证/会话处理在 IDispatchMessageInspector 在加载WebService之前调用。

    当使用我的WebService的应用程序在回收应用程序池时联机时出现问题。然后,应用程序将使用经过身份验证的行为向Web服务发出请求。 这个 IDispatchmessageInspector(IDispatchmessageInspector) 然后,实现将尝试加载设置,但尚未从WebService中的静态构造函数初始化这些设置….

    谢谢你的回答…

        3
  •  0
  •   Zephyr was a Friend of Mine    14 年前

    您可以使用WCF运行时基础结构来为您处理这个问题。尝试向WebService类添加以下属性:

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