В ASP.NET я использую jQuery AJAX на странице, выгружаемой в POST обработчику http. Это работает, как и ожидалось - AJAX срабатывает при выгрузке страницы... если только я не остаюсь на странице более 60 секунд. После этого, когда страница закрыта, AJAX POST, похоже, не попадает на сервер. Он отлично работает на моем локальном хосте, но не в нашей среде разработки или контроля качества.
Fiddler либо ничего не показывает, либо выдает общий код 401 при вызове обработчика. Я написал простой тестовый скрипт, чтобы использовать AJAX для проверки связи с сервером каждые 30 секунд на случай, если мы получим какой-то тайм-аут или срок действия токена NTLM истекает, но не кости. Мы можем видеть пинг на сервере, но мы вообще не можем видеть AJAX POST на сервере, если он не запущен до истечения 60 секунд.
Вот 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
}
Любые идеи или возможные объяснения относительно того, почему это может происходить?