C# MVC 5/.NET 4.5-长时间运行过程
我在Rackspace上有一个网站,可以进行计算,计算时间从30秒到几分钟不等。最初我用signar实现了这一点,但由于过度使用CC,我不得不将其拔出。托管的Rackspace站点实际上并不是为这种用途而设计的。议案被否决了 基本代码如下所示,它在我的测试服务器上运行良好,但是如果计算时间超过30秒,当然会在Rackspace上出现超时错误,因为他们的观察者将其杀死。(旧代码)我被告知该操作必须写入流以保持其活动。在过去的日子里,我会启动一个线程并轮询该站点,直到线程完成。如果有更好的方法,我宁愿选择 在.NET4.5中,我似乎可以使用HttpTaskAsyncHandler来实现这一点。但我不明白。根据我的理解,下面的(新代码)是您将使用的处理程序,它将旧代码放在using中,并将其放在ProcessRequestAsync任务中。当我尝试调用CalcHandler/Calc时,我得到一个404错误,很可能与路由有关。我试图跟踪此链接,但也无法使其工作。add名称是“myHandler”,但示例链接是“feed”,我们是如何从一个链接到另一个链接的。他们提到他们创建了一个类库,但是代码可以和当前代码在同一个项目中吗 另外,如果需要几分钟的时间,HttpTaskAsyncHandler是否允许我将请求保持活动状态直到完成?基本上,我应该使用其他东西来完成我的目标 旧代码C# MVC 5/.NET 4.5-长时间运行过程,c#,.net,asp.net-mvc,httptaskasynchandler,C#,.net,Asp.net Mvc,Httptaskasynchandler,我在Rackspace上有一个网站,可以进行计算,计算时间从30秒到几分钟不等。最初我用signar实现了这一点,但由于过度使用CC,我不得不将其拔出。托管的Rackspace站点实际上并不是为这种用途而设计的。议案被否决了 基本代码如下所示,它在我的测试服务器上运行良好,但是如果计算时间超过30秒,当然会在Rackspace上出现超时错误,因为他们的观察者将其杀死。(旧代码)我被告知该操作必须写入流以保持其活动。在过去的日子里,我会启动一个线程并轮询该站点,直到线程完成。如果有更好的方法,我宁
[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分钟后。对不起,我不明白这如何适用于我的问题。它们是需要几分钟时间的请求,而不是长时间运行的操作。NET4.5是否有更好的方法来实现这些API请求,或者只是恢复到旧标准?在我的问题中我是否还不清楚?在我看来,最直接的解决方案是删除/提高机架空间请求超时限制。另一方面,
AsyncTimeout
必须与CancellationToken
结合使用-它不会像同步超时那样终止您的请求;它只会通过设置CancellationToken
来要求它取消。我同意机架空间增加超时,但这不是一个选项。您是否有在MVC 5和.NET 4.5中使用CancellationToken的参考或示例?