Jus*_*nP8 5 asp.net asp.net-mvc session jquery cross-application
我有2个应用程序在同一个域上运行.流程如下:
应用程序1是WebForms(asp.net framework 2.0),Application 2是ASP.NET MVC 3(框架4.0)
当用户在应用程序2上时,我想在应用程序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
Run Code Online (Sandbox Code Playgroud)
然后,我只是在Application 1使用jQuery中定期调用此处理程序:
$.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的会话保持活动状态?
在每个网站上创建一个页面,即可以不时地重新加载一个小图像.
现在,您将加载一个返回图像的处理程序,而不是图像.
<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>
Run Code Online (Sandbox Code Playgroud)
然后在应用程序中使用iframe,使用图像重新加载来加载其他应用程序页面.或者通常使用iframe,因为使用iframe,您可以保留来自2个不同站点的Cookie更新.
<iframe src="application2.aspx" width="0" height="0"></iframe>
Run Code Online (Sandbox Code Playgroud)