【问题标题】:ASP.NET MVC3 web and background processesASP.NET MVC3 Web 和后台进程
【发布时间】:2011-10-16 21:01:45
【问题描述】:

我有一个用 ASP.NET MVC3 编写的 Web 项目。我的 Web 应用程序的一部分用于保存图像,运行速度很慢。因此,在尝试保存 100 张图像后(也对它们进行了一些其他工作),它运行缓慢,用户必须在浏览器中等待很多时间。

我正在考虑设计一个后台服务(进程),我会向它发送一些数据,它将在后台运行,而不会减慢网站的使用速度。具体来说,我需要一个可以处理单个字符串队列的服务。 Web 应用程序可以随时在队列中发送一个新字符串,服务必须对队列中的字符串做一些工作。

我不知道从哪里开始或使用什么。有什么建议么? :)

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 service web


    【解决方案1】:

    您似乎知道所需的基本流程,从应用程序获取请求,将数据传递给 wcf 服务,返回适当的视图。 wcf 在后台工作。如果您想通知发出请求的用户后台处理已完成,那就更棘手了,但是您始终可以让 wcf 服务向公共消息表写入一条消息,供 mvc 应用程序检查的用户使用。

    【讨论】:

      【解决方案2】:

      可能有多种不同的方式来设计这样的东西。

      一种方法是在 Windows 服务中托管 WCF 服务,该服务管理后台作业并具有具有以下方法的服务接口:

      Guid StartJob(...) //returns new jobId<br/>
      SomeInfoObject CheckJobStatus(Guid jobId)
      

      这将允许您的 Web 应用程序进行轮询。使用 Ajax,如果您愿意,您可以向用户显示一个进度条(客户端会向您的 Web 应用程序发出 Ajax 请求,然后调用该服务进度信息)。

      另一种方法是将任务信息写入数据库以安排新作业。可以使用 Windows 服务(甚至启动进程的计划任务)来完成作业并在作业完成时更新数据库。

      【讨论】:

      • 实际上,我的第一个想法是使用作为 Windows 服务托管的 WCF 服务。我只是想听听更多的想法,也许有更好的东西可用,但 wcf 服务对我来说听起来不错。我不需要服务的任何回复,只需开始工作。你认为这应该是 GET 还是 POST 方法?
      • 另外,例如,让服务每 24 小时调用一次 StartJob 方法的最佳方法是什么?
      • @Nebo - 当数据将被更改时,通常最好使用 POST 而不是 GET。 GET 意味着检索某些东西,而不是创建或更改它。
      【解决方案3】:

      任何形式的队列都可以在这里使用。查看 RabbitMQ 或 MSMQ。基本上你想要的只是在某个地方存储你想要其他东西处理的消息。

      可以使用 BackgroundWorker 或其他东西 - 将其设为静态并在 global.asax 中的 Application_Start 上创建它。我认为,尽管您最好拥有某种形式的机制,这种机制不会在网站重新启动或其他任何事情时被破坏。

      另一种选择是将值放入数据库中,然后您可以轻松跟踪状态和反馈。

      【讨论】:

        【解决方案4】:

        在采用自定义后台服务方法之前,为什么不考虑异步请求处理。

        在 MVC 3 中,您可以通过实现 AsyncController 非常轻松地构建异步控制器。有时,如果我们对如何进行并面对无数选择没有清晰的认识,那么重用 CLR 的好东西是更好的选择。异步控制器利用 IIS 工作线程池,将所有繁重的长时间运行任务转换为后台工作线程,从而释放其他线程,从而缓解您遇到的性能问题。在编码方面,它并不那么麻烦。

        例如,您可以查看此链接:

        Using an Asynchronous Controller in ASP.NET MVC

        再次,我的建议是在寻找其他地方之前探索原生 MVC 异步方法。

        【讨论】:

        • 这并不能解决他的问题。他不是在处理服务器负载问题,而是在处理请求长度问题。异步控制器仍然需要相同的时间来获得用户的结果视图,它只是为其他请求释放线程。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多