2015-12-01 31 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应用程序是可以接受的