我必须对用户加载的文件进行一些处理。此过程可能需要很长时间才能根据文件中的页数。我打算使用jQuery UI进度条并告诉用户已经处理了多少页面。但是,在第一次ajax调用完成之前,我的进度检查不会返回。两个调用完全正确连接到相应的Web方法。
我已经对此进行了一些研究,我发现了this answer另一个问题,其中几乎说明如果两个调用都使用Session,它们就不会同时处理。我只在其中一个电话中使用会话。
我错过了什么?
这是开始处理文件的初始调用。我将UpdateProgressBar设置为在文件处理开始后运行一秒。
setTimeout("UpdateProgressBar();", 1000);
$.ajax({
type: "POST",
async: true,
data: // my params go here
url: // path to web method
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
// Do stuff when file is finished processing
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
if (errorThrown != null)
alert(textStatus + " : " + errorThrown);
}
});
这是UpdateProgressBar函数:
function UpdateProgressBar() {
$.ajax({
type: "POST",
async: true,
data: // my params go here
url: // path to web method
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (result) {
var totalPages = parseInt($('[id$=lbl_PageCount]').text());
var pagesProcessed = result.d;
var percentProcessed = pagesProcessed / totalPages;
$('#div_ProgressBar').progressbar("value", percentProcessed);
if (pagesProcessed < totalPages)
setTimeout("UpdateProgressBar();", 800);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
if (errorThrown != null)
alert(textStatus + " : " + errorThrown);
}
});
修改:
这是UpdateProgressBar调用的WebMethod。另一个WebMethod确实使用了Session,但正如你所看到的那样。他们都访问了一个dll,但是,我尝试在不使用dll进行更新的情况下进行测试,并没有产生任何影响。
[WebMethod]
public static int CheckPDFProcessingProgress(// params go here)
{
int pagesProcessed = 1;
try
{
OrderService _orderService = new OrderService();
pagesProcessed = _orderService.GetMailingPDFPagesProcessedProgress(PersonID);
}
catch (Exception ex)
{
// log error
}
return pagesProcessed;
}
答案 0 :(得分:1)
我认为您的方法无效,因为您在成功活动中致电setTimeout("UpdateProgressBar();", 800);
。只有在返回ajax请求时才会触发成功事件。这意味着您只在处理完成时检查进度。
答案 1 :(得分:1)
通过一些研究,我发现了两种解决问题的方法。主要问题是会话相关,但是,我没有明确使用会议,这就是为什么它长期以来一直没有找到。
ASP.NET页面认为即使您不手动使用它们,它们也会默认使用Session。因此,为了让Web方法同时执行,您必须明确告诉WebMethods他们不使用Session这样:
[WebMethod(EnableSession=false)]
或者,如果您要使用许多WebMethod并将它们全部存储在一个页面上,您可以将page指令设置为不使用Session,如下所示:
<%@ Page Async="true" EnableSessionState="False" %>
感谢所有人的帮助!