【问题标题】:Keeping a related ASP.NET application's session alive from another ASP.NET application从另一个 ASP.NET 应用程序中保持相关 ASP.NET 应用程序的会话处于活动状态
【发布时间】:2011-08-04 07:14:46
【问题描述】:

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

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

Application 1是WebForms(asp.net framework 2.0),Application 2是ASP.NET MVC 3(framework 4.0)

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

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

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 响应返回内容,并且数据看起来正确。

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

当用户填写 Application 2 中的表单时,我可以使用其他方法来保持 Application 1 的 Session 活动吗?

【问题讨论】:

  • 应用程序是共享应用程序池还是相互隔离?如果它们是隔离的,是每个应用程序都有一个“KeepSessionAlive.ashx”还是应用程序 1 中的一个是唯一的?
  • @Chris Pebble - 它们位于隔离的应用程序池中(应用程序 1 是 2.0 框架应用程序,应用程序 2 是 4.0)。只有应用程序 1 具有“KeepSessionAlive.ashx”

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


【解决方案1】:

在每个站点上创建一个页面,即不时重新加载一个小图像。
现在加载一个返回图像的处理程序而不是图像。

<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

【讨论】:

  • 谢谢!这确实有效,但我最终从我的 KeepSessionAlive.aspx 页面(都在应用程序 1 上)每隔一段时间而不是 .gif 调用我的 KeepSessionAlive.ashx 处理程序。应用程序 2 只是将 iframe 附加到正文,并将 src 设置为 Application1/KeepSessionAlive.aspx。
  • @JustinP8 是的,图像调用不是触发会话的 100% garandy,但 aspx 肯定会触发它。解决方案的诀窍是 iframe。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多