2010-12-01 9 views
0

Je crée un objet singleton dans la première requête au service Web et le conserve dans la mémoire.Problème d'objet Web Service Singleton

Cela fonctionne correctement pendant les premières secondes. Si je fais une demande 5 minutes plus tard, je peux voir que l'objet singleton est créé à nouveau? mon objet singleton est-il disposé après x minutes? Comment puis-je faire pour augmenter la durée de vie de mon objet pour toujours?

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); 
      } 
     } 
+0

J'ai essayé ce GC.KeepAlive (Singleton.Instance); ainsi, mais pas de chance – kakopappa

+0

duplication possible de [problème d'initialisation de service Web] (http://stackoverflow.com/questions/4323211/webservice-initialisation-issue) –

+0

Insérez du code. –

Répondre

2

il n'y a pas de raisons, mais surtout je pense à processus ASPNET recyling.

+0

Suppression de mon message avec la mise à jour de la question, ce serait aussi mon premier soupçon. –

+0

problème était IIS ProcessModel IdleTimeout a été réglé à 20 minutes. Je l'ai mis à 0, maintenant tout fonctionne bien. Merci beaucoup – kakopappa

0

Essayez de tirer de MarshalByRefObject et passer outre InitializeLifetimeService:

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; 
} 

En savoir plus sur LifetimeServices.