2009-12-18 53 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