2015-12-01 61 views
0

在ASP.NET中,我在頁面上使用jQuery AJAX卸載到POST處理程序。這個按預期工作 - AJAX在頁面卸載時觸發...除非我在頁面上停留超過60秒。之後,頁面關閉時,AJAX POST似乎不會觸及服務器。它在我的本地主機上正常工作,但不在我們的開發或qa環境中。在卸載後處理程序的AJAX POST在ASP.NET中60秒後不工作

Fiddler在處理程序被調用時不顯示任何內容或給我一個通用的401。我寫了一個簡單的測試腳本來使用AJAX每隔30秒ping一次服務器,以防我們遇到某種超時或NTLM令牌過期,但沒有骰子。我們可以在服務器上看到ping,但是除非在60秒之前啓動,否則我們無法在服務器上看到AJAX POST。

這是AJAX POST。它最初只是使用jQuery.post(),但我想嘗試設置withCredentials爲true以查看是否是這個問題(它沒有幫助)。

jQuery(window).bind("unload.audit", function() { 
    jQuery.ajax({ 
     type: "POST", 
     url: "IndicativeDataAuditHandler.axd?HasUnsavedChanges=" + _hasUnsavedChanges() + "&PageTitle=" + document.title, 
     xhrFields: { withCredentials: true } 
    }); 
}); 

下面是在Web.config的處理程序入口:

<add name="IndicativeDataAuditHandler" path="IndicativeDataAuditHandler.axd" 
    verb="POST, HEAD" type="Namespace.Namespace, App_Code" preCondition="integratedMode"/> 

而這裏的(重要部件)的處理程序代碼。它稱CSLA對象。

public class IndicativeDataAuditHandler : IHttpHandler, IRequiresSessionState 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 

    public void ProcessRequest(HttpContext context) 
    { 
     try 
     { 
      var applicationID = new Guid(ConfigurationManager.AppSettings["ApplicationID"]); 
      var referrerUrl = context.Request.UrlReferrer.ToString(); 
      IndicativeDataAuditLogCommand.InsertAuditLog(applicationID, GetPageTitle(context), referrerUrl, GetHasUnsavedChanges(context), GetPartyID(context), GetUserID(context)); 
     } 
     catch(Exception ex) 
     { 
      throw new Exception("Failed to send indicative data edit request log.", ex); 
     } 
    } 
    //Some private methods here to get parameters 
} 

任何想法或可能的解釋爲什麼這可能會發生?

回答

0

答案被關閉這個AJAX POST異步請求,所以它看起來是這樣的:

jQuery.ajax({ 
    type: "POST", 
    async: false, 
    url: "IndicativeDataAuditHandler.axd?HasUnsavedChanges=" + _hasUnsavedChanges() + "&PageTitle=" + document.title, 
    xhrFields: { withCredentials: true } 
}); 

由於this question而事實上,我們有時會獲得服務器端沒有請求/響應,我懷疑在頁面關閉之前,AJAX調用沒有完成。

從我所瞭解的情況來看,關閉異步通常是一個糟糕的主意,特別是在頁面正在卸載的時候,所以把它放在一粒鹽裏。我們確定該解決方案對於我們的Intranet應用程序是可以接受的