2

我在 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));
    }
  }
4

1 回答 1

0

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

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

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

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

于 2015-03-01T02:33:12.443 回答