由于idletimeout插件,PageLoad事件多次触发
本文关键字:事件 PageLoad idletimeout 插件 由于 | 更新日期: 2023-09-27 18:07:06
我们在一个asp.net web表单项目中遇到了一些奇怪的问题,其中页面加载并显示一些数据(基本上是一个gridview)。当在页面加载事件中为某个页面设置断点时,我们注意到一些奇怪的事情。大约1-2分钟后,我们的页面加载事件再次启动。再一次. .等。我们不明白为什么会发生这种情况,但我们将其缩小到我们在网站主页上使用的一段javascript代码。
我们正在使用eric hynd的idletimeout插件。代码有一些js看起来像这样:
// cache a reference to the countdown element so we don't have to query the DOM for it on each ping.
var $countdown = $("#dialog-countdown");
var sessionTimeoutWarning = '<%= ConfigurationManager.AppSettings["SessionWarningInSeconds"] %>';
// start the idle timer plugin
$.idleTimeout('#dialog', 'div.ui-dialog-buttonpane button:first', {
idleAfter: sessionTimeoutWarning,
serverResponseEquals: 'OK',
onTimeout: function () {
window.location = "/SessionExpired.aspx";
},
onIdle: function () {
$(this).dialog("open");
},
onCountdown: function (counter) {
$countdown.html(counter); // update the counter
}
});
如果我简单地注释掉这部分代码,应用程序不再有多次调用页面加载事件的问题。我们网站上有这个代码。这基本上发生在任何使用网站母版的页面上。我们做了一些谷歌搜索,发现文章提到类似的问题,但他们说这可能是由于img
标签没有正确的src
设置。但这不是我们的问题,我们的问题只是这个空闲超时插件导致页面加载事件多次触发,我们不确定为什么。在我注释掉代码的那一刻,一切正常。
插件需要一个keepAliveURL:
参数来知道调用哪个服务或处理程序来维持会话
如果你检查GitHub Repo
$.ajax({
timeout: options.AJAXTimeout,
url: options.keepAliveURL,
error: function(){
self.failedRequests--;
},
success: function(response){
if($.trim(response) !== options.serverResponseEquals){
self.failedRequests--;
}
},
complete: function(){
if( recurse ){
self._startTimer();
}
}
});
你注意到应用程序依赖于ajax调用需求
修复:添加keepAliveURL:
监听器
$.idleTimeout('#dialog', 'div.ui-dialog-buttonpane button:first', {
idleAfter: sessionTimeoutWarning,
keepAliveURL: 'keepalive.asmx',
serverResponseEquals: 'OK',
onTimeout: function () {
侦听器(任何web方法都可以)应该按照您的指示响应Content("OK")
:
serverResponseEquals: 'OK',
[WebMethod]
public void keepalive()
{
HttpContext.Current.Response.Write("OK");
HttpContext.Current.Response.End();
}