2013-03-18 50 views
4

我在我的MVC3应用程序中使用Rotativa将pdf生成为内存流,然后通过电子邮件附件将其发送至电子邮件。这工作正常,但它很慢(约5至7秒,只有1个用户),所以我一直试图把它放入一个单独的线程,以便用户不会受到巨大的延迟卡住。MVC3将ControllerContext传递给线程?

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

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

到目前为止,我曾尝试:

  • 创建一个新的线程,并传递上下文中
  • 将其复制到一个新的变量
  • 序列化的背景下复制的背景下,物流进入新线程和反序列化(遗憾的是上下文不可序列化)

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

+0

你有没有想过这个?我面临着同样的情况,目前还没有解决办法。谢谢 – SouthPlatte 2015-09-30 21:22:10

+0

@SouthPlatte不幸的是,我无法找到一个直接的修复。我只是再看看我的设置,在我的情况下,我确实有一个潜在的解决方法。请注意,这适用于我的情况,因为自动发送电子邮件失败的情况非常罕见,如果发生这种情况,用户不知道他们的客户是否收到了电子邮件。 您可以假定流程成功完成并立即向用户返回成功消息,然后执行处理。 – Dratta 2015-10-02 23:08:45

回答

0

下面是我在背景中使用背景进行漫长过程的过程。我正在使用由数据库支持的自定义会话。您需要将所需的任何值传递给“背景”操作。

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