views:

80

answers:

2

Is there something fundamentally wrong with the following design, or can anyone see why would the static properties sometimes loose their values ?

I have a class library project containing a class AppConfig; this class is consumed by a Webforms project.

The skeleton of AppConfig class is as follows:

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

The Static Properties get set once on application start, from the Application_Start event of the Global.asax

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

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

End Sub

Thereafter, whenever we want to access a value in the Web.Config from anywhere, e.g. aspx page code-behind or another class or referenced class, we simply call the static property.

For example,

AppConfig.ConfigValue1()
AppConfig.ConfigValue2() 

This is turn returns the value stored in the static backing fields m_field1, m_field2

Problem is sometimes these values are empty string, when clearly the Web.Config entry has values.

Is there something fundamentally wrong with the above design, or is it reasonable to expect the static properties would keep their value for the life of the Application session?

A: 

I would add some debug/trace outputs to maybe see what's going on. Make sure to trace out any exceptions also.

I would also change the property returns to use the modern syntax (I'm not sure how well that's supported anymore).

return defaultValue

instead of:

ReadSetting = defaultValue
eschneider
A: 

The Static Properties get set once on application start, from the Application_Start event of the Global.asax

Actually that was the problem. Careful inspection of the code revelead it was being set on

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

Conclusion: If you set static props on Session_Start, be prepared to loose them at any time (and they may re-appear again too!).

I have moved it to Application_Start and the problem has gone away.

Now can anyone provide a plausible explanation of the inner workings of IIS that may explain why i encountered this scenario?

joedotnot

related questions