在ASP.NET Web窗体应用程序中,我有一个父窗体,其中包含IFrame中的另一个内容页面。当用户点击内容页面中的链接时,会启动长时间运行的流程(> 30分钟)。完成后,向用户显示一个弹出窗口,指出已处理记录的数量。使用jQuery将会话保持长时间运行状态
我需要以编程方式防止会话超时,而不更改Web.config中的默认20分钟。 我一直在试图实现这里发布的心跳示例(以及遍布网络,所以我知道它应该工作) Keeping ASP.NET Session Open/Alive ,但它似乎主要用于空闲会话。
就我而言,一旦内容页面请求进入服务器端并启动长时间运行的进程,就不会调用HTTP处理程序。当这个过程完成后,所有的呼叫都会立即一个接一个地进行,就像他们已经“排队”一样。
这里是我的HTTP处理程序:
<%@ WebHandler Language="VB" Class="KeepSessionAliveHandler" %>
Imports System
Imports System.Web
Public Class KeepSessionAliveHandler
Implements IHttpHandler, SessionState.IRequiresSessionState
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Session("heartbeat") = DateTime.Now
context.Response.AddHeader("Content-Length", "0")
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
JavaScript函数在头元素父页面。创建间隔每8秒调用一次处理程序(在生产中增加到10分钟)。
function KeepSessionAlive()
{
if (intervalKeepAliveID)
clearTimeout(intervalKeepAliveID);
intervalKeepAliveID = setInterval(function()
{
$.post("KeepSessionAliveHandler.ashx", null, function()
{
// Empty function
});
}, 8000);
}
intervalKeepAliveID
被包含在应用程序的所有页面中主要的Javascript文件中声明。
这是在内容页头
$(document).ready(function()
{
// Ensuring my code is executed before ASP.NET generated script
$("#oGroup_lnkSubmit_lnkButton").attr("onclick", null).removeAttr("onclick").click(function()
{
// Prevent the browser from running away
// e.preventDefault();
window.parent.KeepSessionAlive();
// Wave goodbye
//window.location.href = $(this).attr('href');
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions($(this).attr("name"), "", true, "", "", false, false));
});
});
某处,我读了的Javascript在单个线程上运行我的onclick事件的代码,但鉴于这一事实,我的重复间隔是内容页外,我不相信这应该在这里...
你用什么来回应用户? (您的页面是否轮询完成?或者您是否使用服务器端信令框架?)并且,长时间运行的进程是否直接在您的服务器线程中运行?或者你启动一个工作线程? – GalacticCowboy 2013-03-25 16:19:01
阻止访问会话的请求被阻止,而另一个请求可能具有对会话的写访问权限。这是为了防止cropss-threading问题。我在其他地方给出了答案的细节,我会看看我是否可以挖掘它 – Basic 2013-03-25 16:21:28
没有工作线程,它是onclick事件背后的代码的一部分(它实际上是一个使用链接的用户控件)。我可以看到我的代码在Firebug调试器中被击中。该页面不会轮询完成。这是非常标准的网页形式 - “点击做长时间运行的过程,并返回;也显示弹出” – ChicagoMyKindOfTown 2013-03-25 16:28:17