2010-05-18 61 views
3

以下设计是否存在根本性错误,或者任何人都可以看到为什么静态属性有时会丢失它们的值?静态属性间歇性地失去其价值?

我有一个类库项目包含一个类AppConfig;这个类被Webforms项目使用。

的AppConfig类的骨架如下:

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 

静态属性得到在应用程序启动设置一次,从在Global.asax

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

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

End Sub 

Application_Start事件之后,每当我们想要从任何地方访问Web.Config中的值,例如aspx页面代码隐藏或其他类或引用类,我们只需调用静态属性。

例如,

AppConfig.ConfigValue1() 
AppConfig.ConfigValue2() 

这反过来又返回存储在静态支持字段m_field1值,m_field2

问题是有时这些值是空字符串,当明确了的Web.Config条目具有值。

上述设计是否存在根本性错误,还是期望静态属性能够保持它们在应用程序会话期间的价值是合理的?

回答

0

静态属性得到在应用程序启动设置一次,从在Global.asax

Application_Start事件其实这就是问题所在。代码仔细检查revelead它被上

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

结论成立:如果您在在session_start设置静态道具,准备随时失去他们(他们可能会重新出现过了!)。

我已将其移至Application_Start并且问题已消失。

现在任何人都可以提供一个合理的解释IIS的内部工作原理,可以解释为什么我遇到这种情况?

0

我会添加一些调试/跟踪输出,看看发生了什么。请务必追查任何异常。

我也会改变属性返回使用现代语法(我不知道如何得到支持了)。

return defaultValue 

代替:

ReadSetting = defaultValue