从另一个ASP.NET应用程序保持相关ASP.NET应用程序的会话处于活动状态

时间:2011-04-12 23:10:33

标签: jquery asp.net asp.net-mvc session cross-application

我在同一个域上运行了2个应用程序。流程如下:

  1. 申请1
  2. 申请1 - > 申请2
  3. 申请2 - > 申请1
  4. 应用程序1 是WebForms(asp.net framework 2.0), Application 2 是ASP.NET MVC 3(框架4.0)

    当用户使用应用2 时,我想让会话保持活动应用1

    在构建应用程序1 时,我们构建了一个“KeepSessionAlive.ashx”处理程序,它只在请求时执行Session(“KeepSesssionAlive”)= DateTime.Now(),如{{3}中所述}。我们这样做是因为这是一个评估应用程序,在测试的一些较难的部分,用户可能需要很长时间才能选择答案。这是代码:

    Public Class KeepSessionAlive : Implements IHttpHandler, IRequiresSessionState  
    
        Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
            context.Session("KeepSessionAlive") = DateTime.Now                           
        End Sub
    
        Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
            Get
                Return False
            End Get
        End Property   
    
    End Class
    

    然后,我只是使用jQuery在Application 1内定期调用此处理程序: $.post("KeepSessionAlive.ashx", null, function() { });

    所以,我想我可以使用$ .ajax()从 Application 2 调用相同的处理程序,我甚至考虑使用jsonp,但这似乎不起作用。我编写代码将KeepSessionAlive.ashx中的所有会话变量记录到一个文件中,甚至通过jsonp响应返回东西,数据看起来正确。

    然而,做了一个测试,我在应用程序2 中徘徊了足够长的时间,应用程序1 的会话到期,然后尝试从转换申请1 - > 应用2 ,当我到达应用1 中的返回页面时,我遇到了System.NullReferenceException: Object reference not set to an instance of an object.错误,因为我正在尝试引用其中一个对象会话。会话中唯一的值是Session(“KeepSessionAlive”)。我认为这是因为它创建了一个新会话,但如果是这样的话,为什么我的测试记录会话值显示所有应用程序1 的会话变量?

    当用户填写应用程序2 中的表单时,是否还有其他方法可以使应用程序1 的会话保持活动状态?

1 个答案:

答案 0 :(得分:6)

在每个网站上制作一个页面,这样可以不时地重新加载一个小图像 现在代替图像,加载一个返回图像的处理程序。

<img id="keepAliveIMG" width="1" height="1" src="/img/ui/spacer.gif?" alt="" /> 

<script language="javascript" type="text/javascript"> 
    var myImg = document.getElementById("keepAliveIMG");

    if (myImg){
        window.setInterval(function(){
              myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());
            }, 6000);
    }   
</script> 

然后在应用程序中使用iframe,使用图像重新加载来加载其他应用程序页面。或者通常使用iframe,因为使用iframe,您可以保留来自2个不同站点的Cookie更新。

<iframe src="application2.aspx" width="0" height="0"></iframe>

相关:Reset session timeout without doing postback in ASP.Net