由于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设置。但这不是我们的问题,我们的问题只是这个空闲超时插件导致页面加载事件多次触发,我们不确定为什么。在我注释掉代码的那一刻,一切正常。

由于idletimeout插件,PageLoad事件多次触发

插件需要一个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();
}