【问题标题】:Async callback failing when page is posted back at the same time页面同时回发时异步回调失败
【发布时间】:2012-08-27 12:30:36
【问题描述】:

我的解决方案中遇到了 js 异步回调的问题。这是请求;

  1. 用户点击“生成 Excel”按钮。
  2. 正在生成包含大量数据的服务器 excel 文件(大约需要 2 分钟)。
  3. 在此期间,用户可以在应用程序中进行其他操作,包括页面回发/请求/等。
  4. 生成 excel 时,用户会弹出一个弹出窗口以从服务器下载文件,而不管用户所在的页面是什么。

我做了什么:

  • 创建了一个函数来生成 excel 文件 w.r.t 业务需要“GenerateReport”。 (服务器端)
  • 编写了一个 WebMethod 'GetFilePath',它递归地检查文件是否已在某个服务器位置由 GenerateReport 方法生成,并返回新文件的文件路径,这方法永远不会根据业务逻辑再次返回相同的文件路径。 (服务器端)
  • 创建了一个 javascript 函数 DownloadLink() 递归调用 GetFilePath 方法,延迟为 60 秒。函数调用如下所示:

    PageMethods.GetFilePath(UserId, onSuccess, onError);

  • OnSuccess 和 OnError 是 JS 回调函数,当下载文件的 URL 可用时触发 OnSuccess,此 JS 方法显示弹出下载,出现错误时调用 OnError。

工作正常,直到发生以下情况。 当从 GetFilePath 方法调用 OnSuccesss 并且同时发生一些其他操作的回发时,由于尚未加载新页面并且不会向用户显示下载弹出窗口,因此永远不会进行 OnSuccess 调用。

我应该怎么做才能解决这个问题,以确保用户获得下载链接。

【问题讨论】:

  • 1.获取用户电子邮件地址并使用文件路径发送邮件是最佳解决方案。 2.检查每个页面加载是否创建下载文件,如果文件可用,则生成链接
  • @AnantDabhi ,要求是在服务器上生成文件时,无论用户在应用程序中的页面如何,都应显示文件保存弹出窗口。不能依赖页面加载,因为它需要某种回发。电子邮件很容易,但不是我的电话:(。

标签: .net asynchronous postback webmethod pagemethods


【解决方案1】:

除了每 60 秒检查一次外,在初始加载页面时检查是否有准备好的下载链接。

【讨论】:

  • Web 方法 GetFilePath 从服务器文件夹中获取正确的文件,并在发送前将“_downloaded”附加到文件名中,例如 1.xls 将变为 1_downloaded.xls。这确保了某些已发送的链接不会每次从该方法再次发送给用户。一旦重命名并且没有调用 Onsuccess 的 OP 中提到的问题,相同的链接将永远不会发送回用户,并且用户永远不会再次获得该链接。使用 PageLoad 也不能解决问题,因为文件已经在服务器上重命名了。
  • 也许你需要在页面之间使用状态,比如会话。
  • 是否有完全不同且更好的方法来获得类似的结果?