0

我的 ASP.NET 2.0 应用程序的连接字符串之一出现问题。在某些情况下,我会得到一个ConnectionString Property Has not Being Initialized问题,该问题随机、间歇性地发生,没有任何原因。

我的连接字符串实际上来自网络服务,因为不同类型的用户会根据他们的用户级别提供不同的连接字符串集。

到目前为止我所做的事情是这样的:

我有一个母版页 ( mstr.page) 和 ( ) 后面的相应代码mstr.page.vb

在我的母版页中,我最初检索连接字符串并将其存储到会话变量中,即

Session("ConnString") = "RetrievedConnectionString"

现在在我的一个页面中,让我们说page1.aspx.vb,我使用来自一个类(名为 )的公共共享函数,MyClass.vb并在我的page1.aspx.vb.

一些代码供参考:

[MyClass.vb]
Imports System.Web

NameSpace ClassNameSpace
  Public Class Admin
    Protected Shared da as New DataAccess()

    Public Shared Function MYFunction() as String
      'Execute some sql statements here, using the DataAccess
      stringToReturn = Ctype(da.ExecuteScalar("SQLCommand"), String)
      Return stringToReturn
    End Function
  End Class
End NameSpace

[DataAccessClass.vb]
Public Class DataAccess()
  Private m_ConStr As String = ""

  Public Sub New()
    m_ConStr = HttpContext.Current.Session("ConnString")
  End Sub

  'Some methods for SQL statement execution (ExecuteQuery, ExecuteScalar)
End Class

[Page1.aspx.vb]
Imports ClassNameSpace

Protected Sub Page_Load(....) Handles Me.Load
  Dim strValue as String = Admin.MyFunction()
End Sub

我已经将代码放在上面,以向您展示事情进展的一些粗略想法。

基本上,该函数Admin.MyFunction()有时会失败,因为在数据访问类中,连接字符串似乎已经失去了它的价值(空白或无)。

这已经困扰我很久了。

我希望有人能指出我正确的方向来解决这个问题。基本上,我希望每个访问 Web 应用程序的用户检索到的连接字符串始终保持不变并在任何地方使用。会话变量似乎不是最合适的,因为当 ASP.NET 回收其进程时,会话就会丢失。

顺便说一句,我最初是通过 Web 服务的母版页检索连接字符串。当条件是会话变量丢失时,我尝试在数据访问类中放置相同的检索函数,但我认为我的应用程序在回收过程中无法连接到 Web 服务。

对此的任何建议将不胜感激。

对此进行更新:

我尝试使用会话变量并将模式设置为状态服务器,但显然我正在使用的某些 DLL 无法序列化,因此我又回到了原点。

有一个更好的方法吗?

4

5 回答 5

1

要检查的一件事是您的 Session 是否被破坏。如果您使用(默认)内存中会话,那么只要 ASP.NET 工作进程被回收,会话就会终止。如果这导致了您的问题,您可能需要考虑在 IIS 中使用 ASP.NET SessionServer 或 SQL Server 作为您的会话存储。

于 2009-02-26T15:30:28.977 回答
1

我会尽量限制您对此类事情的 Session 使用。如果您使用 Web.Config 来存储您的连接字符串,您可以随时访问它,它不会像会话一样对您过期。

如果应用程序实例的所有用户都相同,您也可以考虑使用静态数据访问类...

于 2009-02-26T16:21:37.417 回答
0

这是我遇到的完全相同的问题,结果是会话变量死亡,因此无法正确初始化连接字符串。

于 2009-02-26T15:32:17.160 回答
0

为什么您的应用程序不能只使用一个连接字符串?为什么连接字符串需要通过网络服务进入?这给整个过程增加了大量的延迟。我认为它可能与数据库中的数据安全性有关。

如果你必须这样做,我会说,你不能有一个后备/默认连接字符串吗?包装你的代码,试图用一些错误处理将它从会话中拉出来,如果它失败恢复到你的默认值?

于 2009-02-26T15:40:34.567 回答
0

我会将您的网络服务和网络应用程序放在不同的应用程序池中。然后增加 Web 应用程序池的超时长度。

于 2009-02-26T15:44:49.610 回答