2009-12-18 52 views
0

本質上,我希望能夠在用戶讓其會話超時然後單擊最終導致異步回發的事件時捕獲。我想通了,如果我把這個代碼我在session_start(Global.asax中),那麼我能趕上一個會話超時期間發生的回發:使用JavaScript處理asp.net中的會話超時

With HttpContext.Current 
     If TypeOf .Handler Is Page Then 
      Dim page As Page = CType(.Handler, Page) 
      If page IsNot Nothing AndAlso page.IsPostBack Then 
       'Session timeout 
      End If 
     End If 
    End With 

這工作得很好。我的問題是,我希望能夠在Response中注入一些JavaScript,然後調用Response.End(),以便應用程序的其餘部分不會完成執行。問題是,當我嘗試Response.Write("<script ... ")後跟Response.End(),那麼JavaScript不會寫入響應流。我確信應用程序中還有其他地方可以安全地將Javascript寫入響應,但我不能讓應用程序的其餘部分執行,因爲它會在嘗試訪問會話對象時發生錯誤。

綜上所述:我需要注入的JavaScript到Global.asax中在在session_start事件的響應

注意:您可能會奇怪,爲什麼我沒有這樣做,在Session_End中......我們不使用InProc會話,所以Session_End不會被調用...但這只是一個點...只是想澄清爲什麼我在Session_Start中這樣做。

回答

1

寫入到HttpHandler之外的響應流通常不是一個好主意;它可能適用於某些角落的情況,但這不是事情的目的。

你有沒有考慮過使用頁面基類或頁面適配器來做到這一點?這樣,你只需要一個代碼副本,它可以適用於所有頁面或只是你選擇的那些頁面。

另一種選擇是使用URL重寫將傳入請求重定向到生成所需腳本輸出的頁面。

+0

感謝您的建議。你知道如何在不使用Response.Redirect()的情況下安全地重定向嗎?我問的原因是因爲當我們嘗試在AJAX回調期間執行Response.Redirect時(例如,當Page.IsCallBack爲true時)我們會遇到錯誤,並且在這段代碼中,我們通常只需要處理超時當它是一個回調。 – Adam 2009-12-21 19:18:15

+0

一種方法是URL重寫,它通過調用context.RewritePath(newPath)來完成。另一個是Server.Transfer(newPath)。在進入頁面之前,RewritePath()最好,Server.Transfer()最好在此之後。 – RickNZ 2009-12-21 23:05:20

+0

非常感謝! – Adam 2009-12-22 23:20:06