并行表单提交和ajax调用

时间:2013-07-16 15:55:32

标签: html asp.net forms jquery

我有一个网页,可以在服务器上调用长请求。该请求会生成一个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();
})();

1 个答案:

答案 0 :(得分:1)

默认情况下,ASP.NET每个会话只允许一个并发请求,以避免竞争条件。因此,在长轮询请求完成之前,服务器不会响应您的状态请求。

一种可能的方法是立即使表单发布,当状态请求显示完成时,启动一个新请求以获取它知道在服务器上等待它的数据。

或者您可以尝试更改EnableSessionState设置以允许多个并发请求,如here所述。