2014-11-08 120 views
0

我已經四處尋找有關此問題的提示,但是我看到的所有內容都是針對Web應用程序的,但我正在製作一個常規的ASP.NET Web表單網站。請隨身攜帶,我是.Net新手。會話變量在會話過期前丟失

用戶登錄後,我設置了一個Session變量來存儲他們的ID。此ID用於加載諸如其用戶名的內容。該名稱將首先正確顯示,顯示Session變量已被使用。但是,如果我在幾分鐘後刷新頁面,則用戶名稱爲空,表示Session變量現在消失。

我讀過默認會話超時是20分鐘。我在我的託管服務提供商的Asp.net設置中證實了這一點。但是這個變量在20分鐘之前就已經丟失了。

我也看了,我應該有一個Global.asax文件與下面的代碼:

void Session_Start(object sender, EventArgs e) 
{ 
Session.Timeout = 20; 
} 

我這樣做,但幾分鐘後,我仍然失去了變數。然後我讀,我應該把下面的代碼在我的web.config:

<configuration> 
    <system.web> 
     <sessionState mode="InProc" timeout="120" /> 
    </system.web> 
</configuration> 

所以我這樣做,但隨後產生的錯誤說:「分析器錯誤信息:這是使用註冊的節是錯誤的as allowDefinition ='MachineToApplication'超出了應用程序級別。此錯誤可能是由於虛擬目錄沒有被配置爲IIS中的應用程序。「

我不知道還有什麼可以嘗試的。我創建的網站位於我的域的子目錄中,我編輯的web.config和global.asax文件位於該子目錄中,所以我不認爲其他地方存在衝突嗎?

我一直堅持這一段時間,任何幫助非常感謝。

回答

0

您的子目錄未在IIS中標記爲應用程序。這可能是問題的一部分,因爲您尚未正確創建應用程序。由於它未被標記爲應用程序,因此您的web.config的某些功能是非法的,因爲它們只能放入應用程序的根目錄中。

其他因素雖然可以是應用程序池已回收出於某種原因。有時候是由於錯誤,但也適用於其他事件,例如連接池中的數據庫連接用盡,以及最着名的問題,它只是在會話中存儲太多項目,導致應用程序池耗盡內存並回收。

由於您的應用程序位於子目錄中,因此它實際上是另一個應用程序的一部分。在這種情況下,主應用程序發生的任何事情都可能會干擾或放棄會話。根web.config可能會有非常不同的會話狀態設置,這可能會使行爲非常不同。

首先將子目錄設置爲IIS中的應用程序,然後查看其行爲。之後,如果問題仍然存在,就會開始尋找其他問題,例如內存泄漏。您不希望將會話延長太久。如果用戶停止超過20或30分鐘的任何事情,他們很可能不會很快回來。由於會話消耗內存,縮短時間有助於應用程序的性能。如果您需要更長時間的存儲空間,那麼性能通常會更好,並且應用程序的穩定性也可以使用用於數據庫等較長期數據的存儲。

+0

謝謝馬克,我會試試。由於我剛接觸.Net,因此我不認爲必須將子目錄設置爲IIS中的應用程序,因爲它是一個Web表單網站而不是應用程序。我會給這個鏡頭 – Cineno28 2014-11-08 13:31:28

+0

IIS中的應用程序更像是一個操作區或一個獨立的實體。這意味着它內部的任何東西都可以在它自己的內存空間中運行您必須小心,因爲任何應用程序通常都會默認繼承根應用程序的屬性,但您可以在自己的應用程序範圍內重載它們。 – 2014-11-08 15:54:48

+0

很高興知道,謝謝!這可能聽起來像一個愚蠢的問題,但我對.net開發很陌生。我已經分配到的網站使用Windows託管,並在根目錄下有一個php站點。他們現在在一個子目錄中有一個asp.net站點,並要求我在另一個子目錄中創建這個額外的.net站點。是在根源的PHP網站會導致衝突?我不知道他們爲什麼這樣設置它。我將按照你的指示將這個目錄設置爲一個應用程序,但是我想問問這是否可能導致另一個問題 – Cineno28 2014-11-08 16:26:18