2015-11-23 33 views
0

问题的实质是:有一个控制器,其中是一个生成excel文件的方法。根据需要生成并返回。该文件长时间生成1-2小时,而需要突出显示文本通知,请稍候。完成通知后必须删除。下载文件后如何通知?

我找不到我想要的解决方案。

我的英文不好

public ActionResult DownloadFile() 
    { 
     return new FileStreamResult(_exporter.Export(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
    } 
+0

通知需要在网页上完成,它本身已经实现,但我知道如何在流程开始后调用,但不知道如何关闭。 –

+0

那么'_exporter.Export()'需要很长时间吗? –

+0

@Jamie R是的他他 –

回答

1

我索里你只有在回应苹果咬了一口。如果你返回一个文件结果,这就是所有你可以返回的。在向用户提供有关状态的更新时处理此问题的唯一方法是在流外进行文件创建,然后长时间轮询或使用Web套接字定期更新用户。对此操作的请求仅仅是对文件创建进行排队,然后返回常规视图结果。

无论如何,在请求 - 响应周期内发生特别长的运行行为是不明智的。一个Web服务器有一个线程池,通常被称为“最大请求”,因为每个请求都需要一个线程。通常这是默认设置为大约1000,并假定你要尽快清除线程。如果1001个人都试图同时请求这个动作,那么第1001个人将被排队,直到另外1000个线程中的一个被释放,这意味着他们可能会等待近4个小时。即使你从来没有看到你的网站获得这种负载,它仍然是一个很好的DDoS攻击的载体。只需发送几千个请求到这个URL并且你的服务器发生死锁。

此外,我不知道你在做什么,但1-2小时生成一个Excel文件是绝对疯了。无论是你一次处理太多的数据,还是发回几千兆字节的文件,甚至可能无法在Excel中正确打开,或者你正在执行的过程严重未被优化。

+0

感谢您的回答。该文件本身通过14000行获得。吸引数据基础,存储过程和计数公式所花费的时间。 –

+0

尽管如此,只需要1-2小时的处理时间来创建Excel文档就是一个非常明显的问题迹象。也许服务器需要更多资源(RAM,内核等),但是您绝对应该专注于优化*,而不是试图通过让用户更新进度来包装不良解决方案。 –