2013-07-30 142 views
0

我有一個包含幾個.aspx頁面的過程。將一些信息填入其中,掛上去,轉到另一個有iframe的頁面,通過web服務將iframe中的一些文檔上傳到服務器,掛上文檔列表和上傳狀態然後在第三頁上執行其他操作,將所有數據保存到數據庫中。失去會話值

在從頁面1移動到頁面2之前,我在會話變量中放入了一些數據。在第2頁,檢索數據並顯示,一些數據在隨後第2頁的iframe從頁面中上傳文件的過程中投入Session變量,第3頁中的數據是從會話檢索並寫入到數據庫。

在測試服務器上,這一切都很完美。在一個活着的服務器上,我不斷收到(隨機)'對象沒有設置爲引用'的錯誤 - 這似乎是在報告會話變量已經消失。

我的理解是,.aspx頁內...

HttpContext.Current.Session["myvariable"] 
Session["myvariable"] 

的,有效的,同樣的事情。我設置只是用我的會話變量...

Session["Variable1"] = "fred"; 

爲什麼(隨機,有時過程正常工作現場服務器上)我似乎失去我的會話變量任何想法?

這是一個網站,而不是一個Web應用程序。使用框架4.0

+0

在測試服務器上,您通常會很快瀏覽應用程序(爲什麼要等待?)。難道你的用戶需要超過20分鐘(會話超時)才能提交第2頁? –

+0

@Hans Kesting - 不,我正在測試時發生這種情況。幾分鐘後我將瀏覽第1頁到第3頁。 –

回答

0

會發生什麼事是你的在線服務器是回收的應用程序池,這基本上重置用於應用程序的內存在VS2010開發。通常可以設置超時,但如果應用程序池回收,則會重置會話。

解決方案是爲您的會話狀態使用SQL服務器。

試試這個:http://support.microsoft.com/kb/317604

參考鏈接:http://www.codeproject.com/Articles/104082/Configuring-ASP-session-state-on-SQL-server

如果你是一個更大的公共主機託管,他們可能已經坦然了SQL來處理會話狀態,你應該能夠只是讓在您的web.config文件中更改爲使用SQL會話狀態。

Ciao

1

您可能因爲各種原因失去會話。

其中一些是:

  1. 您的sessionState超時過期
  2. 你更新你的web.config或其他文件類型,導致你的應用程序域回收就像在文件夾中的文件的App_Data
  3. 您的應用程序池得到回收
  4. 你只是做副本更新您的網站有很多的文件和身體貼,和ASP.NET會自動回收會話。

如果您不確定可以做事件記錄的原因,爲什麼應用程序池正在回收。可能你會了解原因,並根據你的情況採取預防措施。

進行日誌記錄,你可以在Application_End

public void Application_End() 
{ 
    HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, null, null, null, CultureInfo.InvariantCulture); 

    if (runtime == null) 
     return; 

    string shutDownMessage = (string)runtime.GetType().InvokeMember("_shutDownMessage", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture); 

    string shutDownStack = (string)runtime.GetType().InvokeMember("_shutDownStack", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, runtime, null, CultureInfo.InvariantCulture); 

    //Do Logging as per your need and implementation  
    //Logging.Write(TraceEventType.Error, shutDownMessage, shutDownStack); 
} 
0

寫下面的代碼塊爲好posiblity保存非序列化的對象在你的會話變量,並保持你的會話出PROC的生產服務器(負載均衡嗎? )。檢查你的對象是否可序列化,如果不能使它們可序列化。

+0

我有一個名爲Supervisor的對象。它具有屬性firstName,lastName和Email。我正在創建該對象的列表(在列表中從不超過3個條目)並在會話中保存該列表。你是說我的'Supervisor'對象應該是可序列化的嗎? –

+0

如果你的對象超出了proc,它需要是可序列化的。 – Peter

+0

我不管理現場服務器,儘管我可以看一看 - 如何判斷會話在現場服務器上是否處於「不能使用proc」的狀態? –

0

還有一種情況會話可能會失去其價值。

您可以使用Fiddler工具來找出這個問題。

當您在解決方案中找不到源等某些元素時,可以找到最多的條件。那時服務器將嘗試通過重新啓動項目來重新加載那個沒有根據的或丟失的對象。重新啓動項目將導致重置所有會話對象。

謝謝。