0

我的网络应用程序必须在后台进行一些计算。我研究了多种解决方案,我想使用业务逻辑而不是触发所有计算的 SQL 作业。经过几天的研究,我仍然不相信什么是我的案例的最佳解决方案。

很多文章提到 Quartz.NET,一个单独的 Windows 服务(但我认为这不是大多数共享 Web 主机服务的选项),一个 Windows 任务等......

为了将计算保留在业务逻辑中,我将使用专用的“任务”控制器扩展我的 Web 应用程序,该控制器自动触发计算,然后返回其操作的结果。

Q1:使用 Quartz.NET 定时 Web 请求调用控制器不会那么难,但我怎样才能保证它的安全?如果我将 [Authorize] 属性添加到我的“任务”控制器,它将阻止请求。(请注意,我在 Internet Web 应用程序上使用表单身份验证)我不希望 Internet 上的用户能够启动我的“任务”控制器。

Q2:另外,如果我认为共享 Web 主机服务不支持安装单独的 Windows 服务或远程桌面连接是正确的,我将有 2 个选项:

  • 希望共享 Web 主机服务支持 Windows 任务(但这可以使用授权凭据调用吗?

  • 从我的 application_start 启动 Quartz.NET(这当然不是一个理想的解决方案......)

提前致谢

4

1 回答 1

0

首先,我不会从计划的作业中调用 ASP.NET MVC 控制器。我只是委派给业务组件/服务(无论名称是什么),并确保我们在那里运行具有上下文权限的正确事物。这可能意味着我使用有关为谁完成计算的信息来启动该工作,并将该信息传递给服务组件(计算用户 X 的每日平均值)。我没有看到使用 ASP.NET MVC 堆栈伪装调用的真正好处。

所以 Q1:代码级别的安全,不使用 ASP.NET MVC 堆栈

您始终可以在没有 Windows 服务的情况下运行,然后您只需承担应用程序池在不使用时关闭的风险。解决此问题的一种方法是拥有一个外部 ping 程序,以确保有调用,正如您所指出的那样并不理想。在数据库中拥有作业和触发器可以防止丢失信息,但不能防止失火。

Q2:很可能运行 Quartz.NET 比尝试访问 Windows 计划任务要容易得多。

一些共享提供程序对运行代码有非常严格的设置。如果沙盒过于严密,Quartz.NET 可能根本无法运行。

于 2012-12-28T08:38:02.700 回答