我的MVC应用程序中有一个要求。
我有一个导出到excel功能,花了3分钟的时间(用户点击导出按钮等待)。 在对数据应用某些规则后,此导出将下载包含多个工作表的Excel。 这些规则是数据操作,并在属于某些列的单元格上应用颜色。
为了避免等待时间,我被要求在MVC应用程序中开发一个可以像预定作业一样运行的代码。 此作业必须在预定时间(每天一次)将excel导出到网络中的专用文件夹。 此外,我被要求在应用程序中开发一个网页,其中包含下载这些Excel的链接。
这里的问题(任何帮助将不胜感激):
我选择了Quartz.NET来实现这个要求。这是一个开源(据我所知)可以 提供安排工作的工具(用.NET开发的类)。这是正确的选择还是将来有任何影响?
是否真的需要开发代码或任何其他编码方式的工作来解决这个问题?
答案 0 :(得分:0)
我对Quartz.net不是很熟悉,但我确实知道尝试在与MVC应用程序相同的进程中运行后台/计划任务可能会有问题。
参考2:http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx
基本上,由于IIS处理应用程序池(这是MVC进程运行的位置:假设无论如何都在IIS上进行托管),因此无法保证进程在运行时能够正确完成。
您提到在MVC应用中运行计划任务 。再次,这是不正确的。为什么不能将控制台应用程序项目打入解决方案并从那里驱动代码,然后将其放在服务器上并使用Windows任务计划程序?
就后台任务而言,执行此操作的“正确”方法是将命令从MVC应用程序发送到某种消息队列,然后可以确保命令不会被丢弃。我过去曾经使用过RabbitMQ(一个中间件消息代理)。也许这就是Quartz.net的目标。
此设置通常涉及另一个应用程序(对我来说,通常是在服务器上运行的控制台应用程序),它从消息队列接收命令消息并在其自己的进程中运行,完全独立于MVC,因此IIS AppPools固有的问题和后台任务。
很多工作,真的......人们会认为它会更容易,但这是实现它的必然方法,并保持要运行的任务的完整性。