MVC 5 / .NET 4.5 - 长时间运行的进程

时间:2015-03-01 01:19:52

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

我有一个关于Rackspace的网站进行计算,计算可能需要30秒到几分钟。最初我用SignalR实现了它,但是由于过多的CC使用而不得不猛拉它。托管Rackspace站点实际上并不是为这种用途而设计的。该法案通过了屋顶。

基本代码如下所示,它在我的测试服务器上完美运行但当然由于他们的观察者杀死它而计算时间超过30秒的Rackspace会出现超时错误。 (旧代码)我被告知操作必须写入流以使其保持活动状态。在旧的时代,我会开始一个线程并轮询该网站,直到该线程完成。如果有更好的方式我宁愿接受它。

似乎使用.NET 4.5我可以使用HttpTaskAsyncHandler来完成此任务。但我没有得到它。下面的(新代码)是我理解您将使用的旧代码并将其放入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));
    }
  }

1 个答案:

答案 0 :(得分:0)

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

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

如果此过程需要花费太多时间来计算,那么您的服务器可能会受到DDoS攻击的攻击。<​​/ p>

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