ASP.NET连接字符串
我遇到了一些问题,我的一个ASP.NET 2.0应用程序的连接字符串。有些情况下,我会得到一个ConnectionString属性尚未初始化问题,这是随机发生的,并且没有任何理由。ASP.NET连接字符串
我的连接字符串实际上来自web服务,因为不同类型的用户根据他们的用户级别提供了不同的连接字符串集。
我迄今所做的是这样的:
我有一个母版页(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服务的母版页检索connectionstring。当条件是会话变量丢失时,我试图在数据访问类中放置相同的检索函数,但我认为我的应用程序在回收过程中无法连接到Web服务。
任何意见,将不胜感激这一点。
更新这个:
我试图用会话变量并设置模式状态服务器,但显然这是我现在用某些DLL不能序列,因此我又回到了起点。
有没有更好的方法来做到这一点?
要检查的一件事是如果您的会话被破坏。如果您使用(默认)内存会话,则会话会在任何时候回收ASP.NET工作进程时死亡。如果这是导致你的问题,你可能需要考虑使用IIS中的ASP.NET SessionServer或SQL Server作为Session存储。
这是我遇到的完全相同的问题,事实证明会话变量正在死亡,所以连接字符串无法正确初始化。
那么你做了什么解决方案?谢谢。 – Batuta 2009-02-26 15:34:43
我增加了会话超时时间,并确保在web.config中将会话模式设置为InProc。似乎到目前为止工作。可能是一个更好的方式,因为我不是一个很好的ASP.Net程序员。 – 2009-02-26 15:35:51
我也确保在每个页面上初始化连接字符串,这样它就永远不会被初始化。 – 2009-02-26 15:36:37
为什么不能使用一个连接字符串?为什么连接字符串需要通过web服务进入?这为整个过程增加了大量的延迟。我认为它可能必须在数据库中执行一些数据安全措施。
如果你有做到这一点,我会说,你不能有一个回落/默认连接字符串?将你的代码封装起来,试图将它从会话中拉出来,出现一些错误,并且如果失败还原为默认值?
我会将您的Web服务和Web应用程序放在不同的应用程序池中。然后增加Web应用程序池的超时长度。
我想尽可能地限制你对这类事情的使用。如果您使用Web.Config存储连接字符串,则可以随时访问它,并且不会像过程那样过期。
您也可以考虑对具有静态数据访问类,如果它是为所有用户的应用实例一样的...
我做事先检查会话变量来获取连接字符串的值。当它是Null或Nothing或Empty时,我所做的是尝试再次从Web Service检索连接字符串,但由于回收正在进行,因此无法访问Web服务。 – Batuta 2009-02-26 15:33:43