【问题标题】:MVC 5 / .NET 4.5 - Long running processMVC 5 / .NET 4.5 - 长时间运行的进程
【发布时间】:2015-03-01 01:19:52
【问题描述】:

我在 Rackspace 上有一个网站可以进行计算,计算时间从 30 秒到几分钟不等。最初我用 SignalR 实现了这个,但由于 CC 使用过多而不得不取消它。 Hosted Rackspace 站点确实不是为这种用途而设计的。比尔飞了出去。

基本代码如下,它在我的测试服务器上完美运行,但如果计算时间超过 30 秒,因为他们的观察者杀死了它,那么在 Rackspace 上当然会出现超时错误。 (旧代码)有人告诉我该操作必须写入流以使其保持活动状态。在过去的日子里,我会启动一个线程并轮询该站点,直到线程完成。如果有更好的方法我宁愿接受。

似乎使用 .NET 4.5 我可以使用 HttpTaskAsyncHandler 来完成此任务。但我不明白。下面的(新代码)是我理解的处理程序,您可以通过在 using 中获取旧代码并将其放在 ProcessRequestAsync 任务中来使用。当我尝试调用 CalcHandler / Calc 时,我收到一个 404 错误,这很可能与路由有关。我试图关注这个链接,但也无法让它工作。添加名称是“myHandler”,但示例链接是“feed”,我们如何从一个到另一个。他们提到他们创建了一个类库,但是代码可以和当前代码在同一个项目中吗?

http://codewala.net/2012/04/30/asynchronous-httphandlers-with-asp-net-4-5/

附带说明一下,如果需要几分钟,HttpTaskAsyncHandler 是否允许我在请求完成之前保持活动状态?基本上我应该使用其他东西来完成我想要完成的事情。

旧代码

[Authorize]
[AsyncTimeout(5000)] // does not do anything on RackSpace
public async Task<JsonResult> Calculate(DataModel data)
{
   try
   {
        using (var db = new ApplicationDbContext())
        {
           var result = await CalcualteResult(data);
           return Json(result, JsonRequestBehavior.AllowGet);
        }
   }
   catch (Exception ex)
   {
      LcDataLink.ProcessError(ex);
   }

   return Json(null, JsonRequestBehavior.AllowGet);
}

新代码

public class CalcHandler : HttpTaskAsyncHandler
{
    public override System.Threading.Tasks.Task ProcessRequestAsync(HttpContext context)
    {
        Console.WriteLine("test");
        return new Task(() => System.Threading.Thread.Sleep(5000));
    }
  }

【问题讨论】:

  • 在我看来,最直接的解决方案是删除/提高 RackSpace 请求超时限制。附带说明,AsyncTimeout 必须与 CancellationToken 一起使用 - 它不会像同步超时那样终止您的请求;它只会通过设置CancellationToken来要求它取消。
  • 我同意 Rackspace 增加超时,但这不是一个选项。您是否有在 MVC 5 和 .NET 4.5 中使用 CancellationToken 的参考或示例?

标签: c# .net asp.net-mvc httptaskasynchandler


【解决方案1】:

这不是最好的方法。通常您需要创建一个单独的进程(Azure 中的“工作角色”)。

此过程将处理长时间的操作并将结果保存到数据库。使用 SignalR(或通过每 20 秒调用一次 api 方法),您将在客户端(您的浏览器)更新此操作的状态。

如果此过程需要花费太多时间来计算,您的服务器将可能容易受到 DDoS 攻击。

此外,它取决于配置,但长时间运行的操作可能会被服务器本身杀死。默认情况下,如果我没记错的话,在执行 30 分钟后。

【讨论】:

  • 对不起,但我不明白这如何适用于我的问题。它们是最多需要几分钟而不是长时间运行的请求。 .NET 4.5 是否有更好的方法来实现这些 API 请求或只是恢复到旧标准?我的问题有那么不清楚吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多