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

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

我在 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/

相关文章:

c# - 无法在 nvarchar 上调用方法

C# 调试属性

c# - DbConnection 与 OleDbConnection 与 OdbcConnection

c# - 将图标转换为 Png

c# - 如何阻止 MembershipService.CreateUser() 在 ASP.NET MVC 上自动登录?

asp.net mvc 重定向到操作而不触发当前 View 中的验证?

c# - C# 中不寻常的成员覆盖语法

c# - 如何从 COM 调用者调用 .Net 嵌套类的方法

c# - 有时添加 WCF 服务引用会生成一个空的 reference.cs

javascript - 将引导选择单元动态插入表行不起作用