无法使用 Windows 服务,因为该站点远程托管在共享服务上,并且主机不允许服务。
那可能是个问题。此托管服务是否提供任何其他类型的调度功能?如果没有,那么您可能需要考虑更改您的托管服务。
你是对的,因为 ASP.NET不是你用来安排任务的工具。Web 应用程序是一个请求/响应系统(并且非常受托管进程的支配,IIS 通常用于 ASP.NET)。所以你需要一些方法来安排任务定期执行。Windows 服务、Windows 任务计划程序或其他一些任务计划工具。
至于能够手动调用流程的要求,就是把逻辑的调用和逻辑本身分开的简单问题。想象以下组件:
- 执行逻辑的模块,不绑定到任何 UI 或任何调用它的方式。基本上是一个类库项目(或其中的一部分)。
- 引用类库并调用逻辑的 Windows 服务或控制台应用程序。
- 引用类库并调用逻辑的 Web 应用程序。
一旦你弄清楚如何安排控制台应用程序,只需安排它,一切就准备好了。如果该过程返回一些信息,那么控制台应用程序还可以执行任何必要的通知来通知人们该信息。
然后,Web 应用程序也可以在某个地方有一个接口来手动调用该过程。由于该过程“可能需要一段时间”,因此您当然不希望界面等待它完成。这可能会导致超时并使系统处于未知状态。相反,您希望将 UI 返回给用户,指示该过程已开始(或已排队),并且在完成时将通知他们结果。有几种选择...
- 您可以使用a
BackgroundWorker
来实际调用该过程。该过程完成后,向调用它的用户发送通知。
- 您可以将记录写入数据库表以“排队”进程,并拥有类似于 Windows 服务或计划的控制台应用程序(与上述相同的场景)的东西,它定期轮询该表以查找排队的任务、执行任务并发送通知。(当然会在此过程中更新表中的状态,因此它不会执行两次。)
无论哪种方式都有利弊,这完全取决于您要如何进行。最终,您将在这里看到两个主要内容:
- 将逻辑本身与逻辑的调度/调用分开。
- 利用调度系统来调度任务。(如果您的托管服务提供商没有,请找到有的。)