2009-02-26 233 views
0

我遇到了一些問題,我的一個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不能序列,因此我又回到了起點。

有沒有更好的方法來做到這一點?

回答

1

要檢查的一件事是如果您的會話被破壞。如果您使用(默認)內存會話,則會話會在任何時候回收ASP.NET工作進程時死亡。如果這是導致你的問題,你可能需要考慮使用IIS中的ASP.NET SessionServer或SQL Server作爲Session存儲。

+0

我做事先檢查會話變量來獲取連接字符串的值。當它是Null或Nothing或Empty時,我所做的是嘗試再次從Web Service檢索連接字符串,但由於回收正在進行,因此無法訪問Web服務。 – Batuta 2009-02-26 15:33:43

0

這是我遇到的完全相同的問題,事實證明會話變量正在死亡,所以連接字符串無法正確初始化。

+0

那麼你做了什麼解決方案?謝謝。 – Batuta 2009-02-26 15:34:43

+0

我增加了會話超時時間,並確保在web.config中將會話模式設置爲InProc。似乎到目前爲止工作。可能是一個更好的方式,因爲我不是一個很好的ASP.Net程序員。 – 2009-02-26 15:35:51

+0

我也確保在每個頁面上初始化連接字符串,這樣它就永遠不會被初始化。 – 2009-02-26 15:36:37

0

爲什麼不能使用一個連接字符串?爲什麼連接字符串需要通過web服務進入?這爲整個過程增加了大量的延遲。我認爲它可能必須在數據庫中執行一些數據安全措施。

如果你做到這一點,我會說,你不能有一個回落/默認連接字符串?將你的代碼封裝起來,試圖將它從會話中拉出來,出現一些錯誤,並且如果失敗還原爲默認值?

0

我會將您的Web服務和Web應用程序放在不同的應用程序池中。然後增加Web應用程序池的超時長度。

1

我想盡可能地限制你對這類事情的使用。如果您使用Web.Config存儲連接字符串,則可以隨時訪問它,並且不會像過程那樣過期。

您也可以考慮對具有靜態數據訪問類,如果它是爲所有用戶的應用實例一樣的...