ASP.NET应用程序的后台作业

时间:2011-08-11 06:17:45

标签: .net asp.net background-process

我的团队正在开发一个ASP.NET应用程序,其中包含一个导入功能。导入通常由用户在网页中输入一些设置(包括要导入的本地文件)启动。当用户点击“导入”时,应该上传文件然后导入。

导入可能是一个非常冗长的操作,因此不可能直接从aspx.cs代码执行,它需要以某种后台方式完成。同样重要的是,一旦上传文件,导入就不会丢失。我还希望导入立即启动 ,而不必等待每隔X分钟检查一次可用工作的服务或计划任务。

到目前为止,我发现的替代方案是:

  • ThreadPool中的后台线程或ASP.NET中的类似。主要是工作,但如果应用程序池被回收,工作就会丢失。
  • 使用定时器检查数据库中的工作表并运行导入的定时服务。可行,但要么有延迟,要么导致非常频繁的DB工作请求。
  • 带有更改通知查询的服务(不知道确切的名称,但可以从SQL服务器订阅更改)。
  • 通过MSMQ获取工作项目的服务。
  • WCF服务,托管在系统服务中,而不是在ASP.NET中,以避免回收。 WCF服务是从ASP.NET内部调用的,或者直接公开并通过AJAX从客户端调用(如果非IIS托管的WCF可以公开AJAX端点)。

还有其他选择吗?是否有人有上述替代方案的经验?

4 个答案:

答案 0 :(得分:2)

你可以有一个Windows服务,它可以监视上传目录的变化(例如使用FileSystemWatcher)。

这样,在服务开始工作之前不会有(或只有极小的)延迟,并且您不需要从服务进行任何类型的轮询。

关于设置(由用户输入):将它们存储在数据库中(并从服务中查询)或将它们写入文件。

答案 1 :(得分:0)

如你所说,有不同的方法和选择。

我们已成功使用Windows服务作为代理(作业管理器)并创建了类型的工作类,这些类插入并配置了一个小的ASPX页面,而在添加新工作程序时根本不需要触摸代理。

通过这种方式,代理程序始终作为Windows服务运行,并且根据worker的类型及其配置,它调用worker的execute方法并执行作业。

你也可以使用像MSMQ那样简单的设计,我们也使用并且工作正常。

答案 2 :(得分:0)

这类似于根据我们的要求向用户发送电子邮件报告。

  1. 用户通过Web应用程序请求报告,该应用程序将记录添加到队列表中。
  2. Windows服务监视队列表并生成报告(基于报告类型可能需要几秒钟到一个多小时)作为PDF格式。
  3. 另一个Windows服务在准备好后会通过电子邮件发送报告。
  4. #2和#3都会定期检查数据库(每个都是排队项目的相关“状态”),并将所有排队但未处理的项目作为批处理处理 - 不是一次处理一个。

答案 3 :(得分:0)

调用执行实际工作的CLR存储过程的DB触发器?

我有很好的MSMQ经验,只是不要用太多数据超载MSMQ。 post import-id:s或类似于MSMQ并将实际有效负载存储在数据库表中。 MSMQ可以处理相当多的数据,但大多数管理工具都非常慢,因为他们倾向于在启动时查看队列中的所有消息(包括有效负载)。