C# Web服务单例对象问题

C# Web服务单例对象问题,c#,asp.net,web-services,C#,Asp.net,Web Services,我在对web服务的第一个请求中创建了一个单例对象,并将其保存在内存中 这在最初几秒钟内工作正常。如果我在5分钟后发出请求,我可以看到singleton对象再次被创建?我的单例对象是否在x分钟后被处理 我怎样才能使我的对象的寿命永远延长 public sealed class Singleton { static ServerInstance instance = null; static readonly object padlock = new

我在对web服务的第一个请求中创建了一个单例对象,并将其保存在内存中

这在最初几秒钟内工作正常。如果我在5分钟后发出请求,我可以看到singleton对象再次被创建?我的单例对象是否在x分钟后被处理

我怎样才能使我的对象的寿命永远延长

    public sealed class Singleton
    {
        static ServerInstance instance = null;
        static readonly object padlock = new object();

        Singleton() {
        }

        public static ServerInstance Instance {
            get {
                lock (padlock) {
                    if (instance == null) {
                        instance = new ServerInstance();
                    }
                    return instance;
                }
            }
        }
        ~Singleton()
        {
          #if DEBUG
                  ExceptionFactory.Fatal("~Singleton() called!");
          #endif
        }
    }


    [WebMethod]
    public string OnReceiveEvent(string objectXmlData, string objectType) {

        if (!Singleton.Instance.initServerComplete) {
            InitServer();
        }

       return Singleton.Instance.OnReceiveEvent(objectXmlData, objectType);
    }


 public void InitServer() {
            if (!Singleton.Instance.initServerComplete) {
                Singleton.Instance.InitServer();
                Singleton.Instance.initServerComplete = true;

                GC.KeepAlive(Singleton.Instance);
            }
        }

可能没有什么原因,但我主要考虑的是ASPNET进程重新链接。

尝试从以下内容派生并重写:


阅读更多信息。

我尝试了这个GC.KeepAlive(Singleton.Instance);同样,但删除我的帖子并没有像更新问题一样幸运,这也是我的第一个怀疑。问题是IIS ProcessModel IdleTimeout被设置为20分钟。我将其设置为0,现在一切正常。谢谢
public override Object InitializeLifetimeService()
{
  ILease lease = (ILease)base.InitializeLifetimeService();
  if (lease.CurrentState == LeaseState.Initial)
  {
     lease.InitialLeaseTime = TimeSpan.FromMinutes(100);
     lease.SponsorshipTimeout = TimeSpan.FromMinutes(100);
     lease.RenewOnCallTime = TimeSpan.FromSeconds(100);
  }
  return lease;
}