MVC3将ControllerContext传递给线程?

时间:2013-03-18 07:32:27

标签: asp.net-mvc-3

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

我遇到的问题是Rotativa需要Controller Context将数据生成到内存流中,这意味着如果您尝试将其放入单独的线程并向用户返回通知,则上下文为处置,pdf生成将失败。

不幸的是,我在服务器端进行了电子邮件验证检查,并在适当的时候返回true / false,false会提示用户修复它并再试一次。这意味着我不能只假设电子邮件始终有效(我可以通过jquery执行此操作,但如果他们将其关闭并尝试提交,则不会收到错误消息)。

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

  • 创建新主题并在
  • 中传递上下文
  • 通过将上下文复制到新变量来复制上下文
  • 序列化上下文,将流传递给新线程并反序列化(遗憾的是上下文不可序列化)

有没有人有其他想法?

1 个答案:

答案 0 :(得分:0)

以下是我在后台使用上下文运行长进程的操作。我正在使用由数据库支持的自定义会话。您需要将所需的任何值传递到“后台”操作中。

using (var client = new WebClient())
{
     var values = new NameValueCollection
     {
         { "sessionid", DataSession.Id.ExtractSid() }
     };
     client.UploadValuesAsync(new Uri(Url.AbsoluteAction("ResultsCallback", "Quote")), values);
}