我在 Rackspace 上有一个做计算的网站,计算可能需要 30 秒到几分钟不等。最初我用 SignalR 实现了它,但由于 CC 使用过多而不得不取消它。 Hosted 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));
}
}
最佳答案
这不是最佳方法。通常您需要创建一个单独的进程(Azure 中的“辅助角色”)。
此进程将处理长时间的操作并将结果保存到数据库中。使用 SignalR(或通过每 20 秒调用 api 方法),您将在客户端(您的浏览器)更新此操作的状态。
如果此过程需要太多时间来计算,您的服务器将可能容易受到 DDoS 攻击。
此外,这取决于配置,但长时间运行的操作可能会被服务器本身终止。默认情况下,如果我没记错的话,在执行 30 分钟后。
关于c# - MVC 5/.NET 4.5 - 长时间运行的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789013/