2010-05-18 5 views
3

Y a-t-il quelque chose de fondamentalement faux avec la conception suivante, ou quelqu'un peut-il voir pourquoi les propriétés statiques perdraient-elles parfois leurs valeurs?Propriété statique perdant sa valeur par intermittence?

J'ai un projet de bibliothèque de classes contenant une classe AppConfig; cette classe est consommée par un projet Webforms.

Le squelette de la classe AppConfig est la suivante:

Public Class AppConfig 
    Implements IConfigurationSectionHandler 

    Private Const C_KEY1  As String = "WebConfig.Key.1" 
    Private Const C_KEY2  As String = "WebConfig.Key.2" 
    Private Const C_KEY1_DEFAULT_VALUE as string = "Key1defaultVal" 
    Private Const C_KEY2_DEFAULT_VALUE as string = "Key2defaultVal" 

    Private Shared m_field1 As String 
    Private Shared m_field2 As String 

    Public Shared ReadOnly Property ConfigValue1() As String 
     Get 
      ConfigValue1= m_field1 
     End Get 
    End Property 

    Public Shared ReadOnly Property ConfigValue2() As String 
     Get 
      ConfigValue2 = m_field2 
     End Get 
    End Property 


    Public Shared Sub OnApplicationStart() 
     m_field1 = ReadSetting(C_KEY1, C_KEY1_DEFAULT_VALUE) 
     m_field2 = ReadSetting(C_KEY2, C_KEY1_DEFAULT_VALUE) 
    End Sub 

    Public Overloads Shared Function ReadSetting(ByVal key As String, ByVal defaultValue As String) As String 
     Try 
      Dim setting As String = System.Configuration.ConfigurationManager.AppSettings(key) 
      If setting Is Nothing Then 
       ReadSetting = defaultValue 
      Else 
       ReadSetting = setting 
      End If 
     Catch 
      ReadSetting = defaultValue 
     End Try 
    End Function 

    Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create 
     Dim objSettings As NameValueCollection 
     Dim objHandler As NameValueSectionHandler 

     objHandler = New NameValueSectionHandler 
     objSettings = CType(objHandler.Create(parent, configContext, section), NameValueCollection) 

     Return 1 
    End Function 

End Class 

Les propriétés statiques mis une fois sur get démarrage de l'application, de l'événement Application_Start du Global.asax

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) 

    //Fires when the application is started 
    AppConfig.OnApplicationStart() 

End Sub 

Par la suite, chaque fois que nous vouloir accéder à une valeur dans le Web.Config de n'importe où, par exemple aspx page code-behind ou une autre classe ou classe référencée, nous appelons simplement la propriété statique.

Par exemple,

AppConfig.ConfigValue1() 
AppConfig.ConfigValue2() 

C'est son tour renvoie la valeur stockée dans les champs de support statiques m_field1, m_field2

Le problème est parfois ces valeurs sont une chaîne vide, quand bien l'entrée Web.Config a valeurs.

Y a-t-il quelque chose de fondamentalement faux avec la conception ci-dessus, ou est-il raisonnable de s'attendre à ce que les propriétés statiques conservent leur valeur pendant toute la durée de la session Application?

Répondre

0

Les propriétés statiques mis une fois sur get démarrage de l'application, de l'événement Application_Start du Global.asax

En fait, c'était le problème. Une inspection minutieuse du code revelead il était situé sur

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs) 
     AppConfig.OnApplicationStart() 
End Sub 

Conclusion: Si vous définissez des accessoires statiques sur Session_Start, soyez prêt à les perdre à tout moment (et ils peuvent réapparaître à nouveau trop!). Je l'ai déplacé à Application_Start et le problème a disparu.

Maintenant, quelqu'un peut-il fournir une explication plausible du fonctionnement interne de IIS qui peut expliquer pourquoi j'ai rencontré ce scénario?

0

Je voudrais ajouter quelques sorties de débogage/trace pour voir ce qui se passe. Assurez-vous de tracer toutes les exceptions aussi.

Je voudrais aussi changer les retours de propriété pour utiliser la syntaxe moderne (je ne suis pas sûr à quel point c'est supporté plus).

return defaultValue 

au lieu de:

ReadSetting = defaultValue 
Questions connexes