Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 5/.NET 4.5-长时间运行过程_C#_.net_Asp.net Mvc_Httptaskasynchandler - Fatal编程技术网

C# MVC 5/.NET 4.5-长时间运行过程

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上出现超时错误,因为他们的观察者将其杀死。(旧代码)我被告知该操作必须写入流以保持其活动。在过去的日子里,我会启动一个线程并轮询该站点,直到线程完成。如果有更好的方法,我宁

我在Rackspace上有一个网站,可以进行计算,计算时间从30秒到几分钟不等。最初我用signar实现了这一点,但由于过度使用CC,我不得不将其拔出。托管的Rackspace站点实际上并不是为这种用途而设计的。议案被否决了

基本代码如下所示,它在我的测试服务器上运行良好,但是如果计算时间超过30秒,当然会在Rackspace上出现超时错误,因为他们的观察者将其杀死。(旧代码)我被告知该操作必须写入流以保持其活动。在过去的日子里,我会启动一个线程并轮询该站点,直到线程完成。如果有更好的方法,我宁愿选择

在.NET4.5中,我似乎可以使用HttpTaskAsyncHandler来实现这一点。但我不明白。根据我的理解,下面的(新代码)是您将使用的处理程序,它将旧代码放在using中,并将其放在ProcessRequestAsync任务中。当我尝试调用CalcHandler/Calc时,我得到一个404错误,很可能与路由有关。我试图跟踪此链接,但也无法使其工作。add名称是“myHandler”,但示例链接是“feed”,我们是如何从一个链接到另一个链接的。他们提到他们创建了一个类库,但是代码可以和当前代码在同一个项目中吗

另外,如果需要几分钟的时间,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分钟后。

对不起,我不明白这如何适用于我的问题。它们是需要几分钟时间的请求,而不是长时间运行的操作。NET4.5是否有更好的方法来实现这些API请求,或者只是恢复到旧标准?在我的问题中我是否还不清楚?在我看来,最直接的解决方案是删除/提高机架空间请求超时限制。另一方面,
AsyncTimeout
必须与
CancellationToken
结合使用-它不会像同步超时那样终止您的请求;它只会通过设置
CancellationToken
来要求它取消。我同意机架空间增加超时,但这不是一个选项。您是否有在MVC 5和.NET 4.5中使用CancellationToken的参考或示例?