使用AJAX& amp;动态创建PDF C#

时间:2009-09-04 20:33:10

标签: c# ajax multithreading

我有一个网页。有一个生成pdf报告的链接。当用户点击链接时,pdf生成过程应该开始。由于生成的pdf的文件大小很大(> 15Mb),用户不能等待&因此必须继续他的其他活动。这意味着现在将发生以下同时发生的事情

  1. PDF生成过程一直没有增加
  2. 用户继续浏览,没有任何震动
  3. 完成pdf生成后,用户应收到包含下载链接的电子邮件。
  4. 基本上是实施

    1. 用户点击生成报告按钮
    2. 使用AJAX我调用c#函数说generateReport()
    3. 问题

      1. 当我这样做时,不允许用户执行任何操作,除非&直到整个过程完成。当然,他可以点击不同的链接但没有响应,因为AJAX调用仍在实施中
      2. 我如何实现这一点。我是一个使用C#创建aspx网页的dot net(框架2.0)开发人员。我使用javascript& AJAX(AjaxPro)可以摆脱典型ASP.NET Web应用程序中的回发。

4 个答案:

答案 0 :(得分:2)

在这种情况下,您可能需要考虑将PDF生成代码拆分为单独的服务,您的AJAX代码可以与之交互以启动PDF创建。一旦服务创建了PDF文件,该服务就可以通过电子邮件向用户发送相关信息。

AJAX代码将使用远程处理与服务进行通信。

答案 1 :(得分:1)

您在创建报告并将其通过电子邮件发送给用户时的概念非常好。

在客户端执行此操作应该非常简单,即指示需要创建报表的基本调用。即将其保存到表(报告队列)

报告的实际创建不应该由来自前端的任何调用直接触发,创建一个服务(Windows服务),该服务通过“报告队列”生成PDF文件并发送电子邮件。 / p>

作为一个附加选项,假设PDF没有被销毁(即不是仅限电子邮件的解决方案),可以在客户端上创建ajax弹出窗口,然后用户可以转到报告页面并下载已生成的文件。

答案 2 :(得分:0)

您可以尝试使用定时器对函数isReportDone()进行AJAX调用,然后函数isReportDone()检查存储库中的PDF。为了生成PDF,我认为您需要将该任务从正常的请求 - 响应线程中传出。通过调用单独的线程(多线程很有趣)来处理它,或者将数据传递给服务器上的单独服务。

这些只是两个想法我真的有一个类似的问题,从数据库生成一个必须强制下载的文件。我最后在一个单独的窗口中调用一个单独的页面,将数据写入响应流。它实际上很有效,直到客户的网络阻止任何弹出窗口。

答案 3 :(得分:0)

  1. 用户要求生成报告(单击按钮)
  2. Page启动对GeneratePdf(args)的异步服务调用。
  3. 用户在生成Pdf时会看到某种微调器,这样他们就知道发生了什么。
  4. 生成Pdf( iTextSharp 可能会派上用场)。
  5. Pdf存放在某处。数据库blob字段是理想的,这样web服务就可以传回新文件的id。如果做不到,请将文件名传回ajax代码。
  6. Webservice async(see this one)完成事件发生,ajax代码抛出弹出窗口或重定向到新页面。也许你想要用“Ready!”替换微调器。链接。
  7. 链接到pdf报告文件将通过电子邮件发送给用户。