【发布时间】:2011-08-04 07:14:46
【问题描述】:
我有 2 个应用程序在同一个域上运行。流程是这样的:
- 应用程序 1
- 应用程序 1 -> 应用程序 2
- 应用程序 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