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

时间:2014-06-05 14:02:04

标签: javascript c# jquery asp.net

我们在asp.net Web表单项目中遇到一些奇怪的问题,其中页面加载并显示一些数据(基本上是gridview)。我们在页面加载事件中的某个页面上设置断点时发现了一些奇怪的事情。大约1-2分钟后,我们的页面加载事件再次触发......再次......等等。我们无法理解为什么会发生这种情况,但我们将其缩小为我们在网站母版页上使用的一段javascript代码。

我们正在使用eric hynd的idletimeout plugin。代码有一些看起来像这样的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
        }
    });

如果我只是注释掉代码的这一部分,则应用程序不再有多次调用页面加载事件的问题。我们在site.master上有这个代码,所以这基本上发生在使用网站管理员的任何页面上。我们进行了一些谷歌搜索并找到了提及类似问题的文章,但他们表示这可能是由img标签引起的,这些标签没有正确的src设置。但这不是我们的问题,我们的问题只是这个空闲超时插件导致页面加载事件多次触发,我们不确定原因。我评论代码的那一刻一切正常。

1 个答案:

答案 0 :(得分:3)

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