2012-07-07 73 views
2

我有一個Asp.net的web服務。它有方法M1。 M1爲每個會話創建一個文件夾。當會話過期時,我使用以下代碼在global.asax中刪除該文件夾。爲什麼asp.net會話比其超時更早過期?

void Session_End(object sender, EventArgs e) 
    { 
     try 
     { 
      System.IO.DirectoryInfo dirMyPacksFolder = new System.IO.DirectoryInfo(Utilities.getMyPacksFolder(Session)); 
      //dirMyPacksFolder.Parent.CreateSubdirectory("ended_" + Session.SessionID); 
      if (dirMyPacksFolder.Exists) 
      { 
       dirMyPacksFolder.Delete(true); 
      } 
     } 
     catch (Exception ex) 
     { 
      Utilities.logException("", ex); 
     } 
    } 

當我打開我的瀏覽器的web服務,並呼籲M1,它正確操作和文件夾上,我已設置超時到期時間刪除。但是當我第二次提交webservice的「Invoke」按鈕時(會話超時和文件夾被刪除後),其會話開始(創建文件夾)和結束(刪除文件夾)在我設置的超時之前。

爲什麼會發生這種情況?

如果我爲每個方法調用一個新窗口(新會話)調用一切正常。但是當我第二次點擊「Invoke」按鈕時,我遇到了問題。這對於相同的會話來說就像是緩存問題。

回答

3

看一看this post,我相信你的問題可能是相似的:

  • 客戶端發送一個會話ID的Cookie的會話過期
  • 服務器創建一個新會話,把通過發送的ID客戶端
  • 如果請求不訪問會話,會話立即被放棄。

您的WebMethod是否實際訪問會話狀態?如果不是,請嘗試添加對虛擬會話變量的訪問。

更新:

這些代碼行的Global.asax解決的問題:

void Session_Start(object sender, EventArgs e) 
{ 
    Session["dummy"] = "dummy session for solving immediate session expire"; 
} 

更新2

個人而言,我不會做的目錄創建在Session_Start中;相反,我會有一個叫做EnsureMyPacksFolder的方法,應用程序需要在任何嘗試訪問該文件夾之前調用。這看起來像下面這樣,避免了對「虛擬」Session變量的需要,並且意味着只有在實際需要時才創建文件夾。

的Global.asax:

void Session_Start(object sender, EventArgs e) 
{ 
    // No code needed in Session_Start 
} 

void Session_End(object sender, EventArgs e) 
{ 
    if (Session["MyPacksFolder"] != null) 
    { 
     // Folder has been created, delete it 
     // ... add code to delete folder as above 
    } 
} 

別的地方:

public static void EnsureMyPacksFolder() 
{ 
    if (Session["MyPacksFolder"] == null) 
    { 
     // Add code to create MyPacksFolder that was previously in Session_Start 

     Session["MyPacksFolder"] = true; 
    } 
} 
+0

是的,我使用會話狀態 – breceivemail 2012-07-08 05:16:08

+0

你不使用'Session_Start'和'Session_End'爲***計數***用戶? 我使用WebFarm,sessionsate模式SqlServer。 任何源代碼samplefull? 未找到鏈接,請使用http://thecodeking.co.uk/article/asp-net-session-end-event-fires-immediately-after%20session-start-resolved/ – 2016-11-05 13:17:55

0

您是否將以下內容添加到WebMethods?

[WebMethod (EnableSession = true)] 
+0

是我做到了。如果我爲每個方法調用打開一個新窗口,則一切正常。但是當我第二次點擊「Invoke」按鈕時,我遇到了問題。 – breceivemail 2012-07-07 11:47:47

+0

這就像是針對同一會話的緩存問題。 – breceivemail 2012-07-07 11:48:54

+0

是不是由Cookie管理的會話?什麼是您的cookie過期時間 – Doomsknight 2012-07-07 11:53:18

0

如果您在Web服務路徑下創建和刪除文件夾,iis會立即重新啓動。看看post

+0

我知道這一點。不,我正在創建應用程序主文件夾之外的文件夾。我已經測試並知道Application_End沒有被觸發。 – breceivemail 2012-07-07 11:55:51

+0

您還需要在客戶端代碼上啓用會話。只要嘗試編寫客戶端應用程序(不在瀏覽器上測試)並將cookie容器分配給它。 http://www.drbob42.com/examines/examin47.htm – hkutluay 2012-07-07 11:59:48