我必须对用户加载的文件进行一些处理。根据文件中的页数,此过程可能需要很长时间。我计划使用jQueryUI的进度条,告诉用户已经处理了多少页面。但是,在第一次ajax调用完成之前,我的进度检查不会返回。正确完成的两个调用都连接到相应的web方法。
我已经对此进行了一点研究,并找到了另一个问题的答案,该问题几乎表明,如果两个调用都使用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;
}
我认为您的方法不会奏效,因为您调用setTimeout("UpdateProgressBar();", 800);
是成功事件的一部分。只有当ajax请求返回时,才会触发成功事件。这意味着您只在处理完成后才检查进度。
看看这个StackOverflow的答案。
通过一点研究,我发现了两种解决问题的方法。主要问题是与会话有关,然而,我没有明确使用会话,这就是为什么我这么长时间都没有使用会话的原因。
ASP.NET页面认为它们默认使用会话,即使您没有手动使用它。因此,为了让您的Web方法同时运行,您必须明确地告诉WebMethods,它们不会像这样使用会话:
[WebMethod(EnableSession=false)]
或者,如果你将有许多WebMethod,并将它们全部存储在一个页面上,你可以将页面指令设置为不使用Session,如下所示:
<%@ Page Async="true" EnableSessionState="False" %>
谢谢大家的帮助!