4

我在我的 MVC3 应用程序中使用 Rotativa 将 pdf 生成到内存流中,然后作为电子邮件附件通过电子邮件发送出去。这工作正常,但速度很慢(只有 1 个用户约 5-7 秒)所以我一直在尝试将它放入一个单独的线程中,这样用户就不会陷入巨大的延迟。

我一直面临的问题是 Rotativa 需要控制器上下文将数据生成到内存流中,这意味着如果您尝试将其放在单独的线程中并向用户返回通知,那么上下文将被释放并且pdf生成将失败。

不幸的是,我在服务器端进行了电子邮件验证检查,并在适当的情况下返回真/假,假将提示用户修复并重试。这意味着我不能仅仅假设电子邮件始终有效(我可以通过 jquery 来完成,但如果他们将其关闭并尝试提交,他们将不会收到错误消息)。

到目前为止,我已经尝试过:

  • 创建一个新线程并传入上下文
  • 通过将上下文复制到新变量来复制上下文
  • 序列化上下文,将流传递给新线程并反序列化(不幸的是上下文不可序列化)

有没有人有任何其他想法?

4

1 回答 1

0

这是我在后台运行一个带有上下文的长进程的方法。我正在使用由数据库支持的自定义会话。您需要将所需的任何值传递给“背景”操作。

using (var client = new WebClient())
{
     var values = new NameValueCollection
     {
         { "sessionid", DataSession.Id.ExtractSid() }
     };
     client.UploadValuesAsync(new Uri(Url.AbsoluteAction("ResultsCallback", "Quote")), values);
}                
于 2014-03-07T23:00:41.620 回答