2014-06-05 43 views
1

我們在asp.net web表單項目上發生了一些奇怪的問題,頁面加載和顯示一些數據(基本上是gridview)。在頁面加載事件中的某個頁面上設置斷點時,我們發現了一些奇怪的事情。大約1-2分鐘後,我們的頁面加載事件再次觸發...並再次..等等。我們無法理解爲什麼會發生這種情況,但我們將其縮小爲我們在網站母版頁上使用的一段JavaScript代碼。PageLoad事件由於idletimeout插件而多次觸發?

我們正在使用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集合引起的。但這不是我們的問題,我們的問題只是這個空閒超時插件導致頁面加載事件觸發多次,我們不知道爲什麼。在我註釋代碼的那一刻,一切正常。

+0

您可以創建重現該問題的plnkr.co頁?或者是在服務器端觸發'PageLoad'?如果它位於服務器端,那麼當瀏覽器控制檯發生這種情況時,您會看到什麼HTTP流量? – akonsu

回答

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(); 
} 
+0

keepalive.asmx應該做些什麼?它只是一個空文件嗎?你能發佈一個keepalive.asmx的完整例子嗎? – JonH

+0

@JonH只是'返回Content(「OK」);'告訴idleTimeout一切正常 –

+1

這就是它,非常感謝。 – JonH