我有一个网页,可以在服务器上调用长请求。该请求会生成一个excel文件,并在准备好后将其流回客户端。
通过使用jQuery创建表单元素并调用submit方法来调用该请求。
我希望在处理请求期间显示具有任务进度的用户。
我想在服务器上使用jQuery ajax调用来返回状态消息。
我的问题是,当我调用此服务时(使用$ .ajax)仅当表单提交的请求结束时才会调用回调。
有什么建议吗?
代码:
<script>
function dummyFunction(){
var notificationContextId = "someid";
var url = $fdbUI.config.baseUrl() + "/Promis/GenerateExcel.aspx";
var $form = $('<form action="' + url + '" method="POST" target="_blank"></form>');
var $hidden = $("<input type='hidden' name='viewModel'/>");
$hidden.val(self.toJSON());
$hidden.appendTo($form);
var $contextId = new $("<input type='hidden' name='notifyContextId'/>").val(notificationContextId);
$contextId.appendTo($form);
$('body').append($form);
self.progressMessages([]);
$fdbUI.notificationHelper.getNotifications(notificationContextId, function (message) {
var messageText = '';
if (message.IsEnded) {
messageText = "Excel is ready to download";
} else if (message.IsError) {
messageText = "An error occured while preparing excel file. Please try again...";
} else {
messageText = message.NotifyData;
}
self.progressMessages.push(messageText);
});
$form.submit();
}
<script>
代码使用实用程序库来调用$ .ajax。它的代码是:
(function(){ if(!window.flowdbUI){ throw(“缺少对flowdb.ui.core的引用。”); }
function NotificationHelper() {
var self = this;
this.intervalId = null;
this.getNotifications = function (contextId, fnCallback) {
if ($.isFunction(fnCallback) == false)
return;
self.intervalId = setInterval(function() {
self._startNotificationPolling(contextId, fnCallback);
}, 500);
};
this._startNotificationPolling = function (contextId, fnCallback) {
if (self._processing)
return;
self._processing = true;
self._notificationPolling(contextId, function (result) {
if (result.success) {
var message = result.retVal;
if (message == null)
return;
if (message.IsEnded || message.IsError) {
clearInterval(self.intervalId);
}
fnCallback(message);
} else {
clearInterval(self.intervalId);
fnCallback({NotifyData:null, IsEnded:false, IsError:true});
}
self._processing = false;
});
};
this._notificationPolling = function (contextId, fnCallback) {
$fdbUI.core.executeAjax("NotificationProvider", { id: contextId }, function(result) {
fnCallback(result);
});
};
return this;
}
window.flowdbUI.notificationHelper = new NotificationHelper();
})();
答案 0 :(得分:1)
默认情况下,ASP.NET每个会话只允许一个并发请求,以避免竞争条件。因此,在长轮询请求完成之前,服务器不会响应您的状态请求。
一种可能的方法是立即使表单发布,当状态请求显示完成时,启动一个新请求以获取它知道在服务器上等待它的数据。
或者您可以尝试更改EnableSessionState设置以允许多个并发请求,如here所述。