5

我有 2 个应用程序在同一个域上运行。流程是这样的:

  1. 应用 1
  2. 应用 1 ->应用 2
  3. 应用 2 ->应用 1

应用程序 1是 WebForms(asp.net 框架 2.0),应用程序 2是 ASP.NET MVC 3(框架 4.0)

当用户在Application 2上时,我想在Application 1上保持会话活动。

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

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

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

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

但是,在进行测试时,我在Application 2中逗留了足够长的时间以使Application 1的会话到期,然后尝试从Application 1 -> Application 2进行转换,当我到达Application 1中的返回页面时,我受到了欢迎有一个System.NullReferenceException: Object reference not set to an instance of an object.错误,因为我试图引用 Session 中的一个对象。session 中的唯一值是 Session("KeepSessionAlive")。我认为这是因为它创建了一个新会话,但如果是这种情况,为什么我的测试记录了显示所有Application 1会话变量的会话值?

当用户填写应用程序 2中的表格时,我可以使用其他方法来保持应用程序 1的会话活动吗?

4

1 回答 1

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>

相关:重置会话超时而不在 ASP.Net 中进行回发

于 2011-04-13T00:46:25.063 回答