2011-01-12 70 views
2

我有以下實現一個inproc會議網站:會話和服務器變量Session_End中

protected void Session_End(object sender, EventArgs e) 
     { 
      StreamWriter sw = null; 
      string logFile = Server.MapPath("testSessionLog.txt"); 
      sw = new StreamWriter(logFile, true); 
      sw.WriteLine("Session_End called at " + DateTime.Now); 
      try 
      { 
       //Request is not available in this context 
       if (Request.ServerVariables["Logon_User"] != null && Request.ServerVariables["Logon_User"] != "") 
       { 
        sw.WriteLine("Made it past Request.ServerVariables check"); 
       } 
      } 
      catch (Exception ex) 
      { 
       sw.Write("An error occured: " + ex.Message); 
      } 
      finally 
      { 
       sw.Close(); 
      }   
     } 

我讀了堆一對夫婦的文章(12),其詳談有關使用this.Session得到去HttpSessionState。那麼Server.MapPath()和Request.ServerVariables()呢?我無法讓這些在Session_End中工作。

我將這個相同的代碼塊粘貼到button_Click事件中,它運行時沒有問題。這使我相信它是與Session_End相關的。

我將IIS6設置爲每分鐘一次recylcle。當我有一個打開的會話它吹了: 錯誤:
異常類型:HttpException
異常消息:服務器操作不可用,在這種情況下

在事件查看器中它顯示爲事件1309。它抱怨包含Server.MapPath()

回答

-2

有可能去請求和服務器畢竟。您必須分別使用HttpContext.Current.Request和HttpContext.Current.Server。不會話。兩者之間有一個相當不錯的比較stack.

2

行這個問題是,session_end不是從請求中觸發的。在處理完最後一次請求之後很長時間內,服務器會超時。所以,不存在請求對象。

如果您在會話中呼叫放棄(因爲您已在請求的上下文內完成此操作),則這可能不會成立。我沒有嘗試過,但我懷疑它也不行。

我不知道MapPath - 也許它需要一個活的請求來做它的事情。

+0

你會認爲系統知道哪個會話結束,因此可以將一些原始會話數據關聯到this.Session並將其存儲在此之前.Session.original在吹它遠... – 2011-01-13 14:54:10

+0

您正在尋找請求數據,並且Session_End中沒有Request對象。如果有需要訪問的東西(比如用戶id或者其他東西),然後將它明確地存儲在會話中:* Session [「UserId」] = _userId * – Ray 2011-01-13 15:52:47

+0

我其實不確定我們要找什麼。有12個應用程序,我沒有寫任何應用程序。我只是解決了爲什麼我們每天都會遇到100個錯誤。由於我在下面發佈的「解決方案」擺脫了錯誤,這就是「修復」。 – 2011-01-13 17:25:05