【问题标题】:Should I use a .NET Windows service for this issue?我应该为这个问题使用 .NET Windows 服务吗?
【发布时间】:2010-01-01 22:52:51
【问题描述】:

我有一个用户提出请求的 ASP.NET 网站。每个请求都会启动一个漫长的过程,可能需要几分钟(最坏的情况是 20 分钟)。在请求结束时,会创建一个文件供用户下载。

目前,我有此请求以异步方式启动进程(使用异步页面),但出现超时错误。我怀疑我的方法有缺陷。为了使这个过程具有可扩展性,我的下一个猜测是拥有一个执行长时间运行过程的 Windows 服务。当用户发出请求时,我将请求详细信息添加到数据库表中。 Win 服务会拾取并处理它。与此同时,用户被重定向到一个页面,要求他们在文件创建过程中等待。

这会是理想的方法吗?如果是这样,我是否必须每 x 分钟刷新一次页面以检查 windows 服务是否已完成处理?

【问题讨论】:

    标签: .net asp.net windows-services


    【解决方案1】:

    请参阅我的相关孪生问题here(不过在 Java 中)

    我猜 Windows 也有 Message Que 服务(其实我记得有)

    这正是 MQ 的用途......

    【讨论】:

    • 这也可能是带有 MSMQ 绑定的 WCF 服务的用例。
    • 我倾向于不同意这个选项。我认为使用 MQ 带来的好处很少,而且会产生很多额外的开销。
    【解决方案2】:

    您可以使用 Windows 服务或后台线程。

    Windows 服务的优势在于您可以在远程机器(“计算服务器”)上运行多个服务。

    可以使用内存队列将消息传递给后台线程。对于服务,您应该使用更正式的消息传递系统,例如 SQL Server 的 Service Broker。 Service Broker 还处理持久性并提供一些干净的扩展机制。

    如果有帮助,我会在书中介绍 Service Broker 和后台线程,包括代码示例:Ultra-Fast ASP.NET

    【讨论】:

      【解决方案3】:

      过去我必须做的是在启动漫长过程的用户操作时,我会向数据库写入一个带有状态的“作业”。然后网站可以向用户显示该状态。

      然后,您在服务器上运行了一项服务,该服务监视该数据库表并执行长时间操作,相应地更新状态。然后,该服务将创建文件或将其通过电子邮件发送给用户。

      最后,该服务还必须考虑您希望该文件在您的服务器上驻留多长时间。所以如果你想在这么久之后删除它,你必须有一个过期的状态。

      简而言之,是的,我认为您的方法有缺陷。

      【讨论】:

      • 服务如何通知 UI 流程已完成?还是 UI 需要轮询数据库并刷新页面?
      • 它可以在最基本的页面加载时轮询它,或者按照 Krip 的规定,使用一些花哨的 AJAX 每隔 n 秒左右轮询一次数据库。
      【解决方案4】:

      我投票支持 Windows 服务方法,但也同意 Clarence Klopfstein 的评论,即在网页上向用户显示工作状态。页面可以显示用户有权查看的所有作业的列表。如果该过程最多需要 20 分钟,请继续更新状态,以便用户看到进度。您可以使用一些 JavaScript 自动刷新页面。作业完成后显示文件链接。

      如果你想发疯,写一些 AJAX,在生成文件时弹出一段 toast - 在 toast 中包含指向文件的链接。在网站的每个页面上都包含该 JavaScript 段,以便用户无论身在何处都能收到通知。

      -克里普

      【讨论】:

      • 在创建 AJAX 自动轮询方式以检查状态方面的任何帮助将不胜感激。谢谢
      【解决方案5】:

      任何需要 20 分钟的任务都应该从 ASP.NET 进程中取出,并在域中的其他位置卸载。以下是我在生产环境中使用的一些选项

      1. 如果您有权访问数据库服务器,则在其中创建一个表,用户可以在其中使用参数及其电子邮件地址对作业进行排队。然后创建一个 DTS (SSIS SQL Server 2005-2008),它将每 5-10 分钟检查一次作业,执行并通过电子邮件发送结果。用户已经等了 20 分钟了。

      2. 创建一个 Windows 服务,该服务将轮询作业队列(如上),执行并将结果通过电子邮件发送给用户。

      这两种方式都需要一个作业队列,但是,用户只需提交一个作业并继续前进。结果被发送到他们的邮箱,甚至作为二进制文档存储在数据库中。

      【讨论】:

        【解决方案6】:

        这个问题是消息队列的完美候选,你应该有一个 Windows 服务,它承载一个使用 MSMQ 作为传输的 WCF 服务,MSMQ 将保证消息的传递,并且它会保证没有消息丢失服务失败或机器重启的情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-21
          • 2017-09-15
          相关资源
          最近更新 更多