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