ASP.Net服务器端代码,用户注销后是否继续运行?

时间:2018-04-06 08:57:52

标签: c# asp.net asp.net-web-api

为了给出这个问题上下文,我们有一个ASP.Net MVC项目,它要求您进行身份验证以使用该系统(典型的saas产品)。该项目包括一个不活动计时器,如果用户长时间离开屏幕,它将记录用户。该项目是SPA类型项目,Web API用于获取/发布相关数据。

我目前正在开发一个例程,可以归档大量潜在的数据,而且流程本身也很好。我不确定的是,一旦进程启动,将帖子发送到web api并且服务器端代码开始运行,如果发生不活动超时或用户由于某种原因手动注销,它是否继续运行?

我认为它会,但我不想依赖假设。

编辑:例如 以下评论/答案。屏幕将包含他们希望存档的数据的复选框列表,因此不是设置的数据列表,因此该项目确实需要处理任务。

以下代码在运行时在客户端(省略了检查等,数据变量包含ticks的所有true / false值):

self.Running = true;
self.showProgress();

http.ajaxRequest("post", "/api/archive/runarchive", data)
   .done(function () {
        self.Running = false;
   })
   .fail(function () {
        self.Running = false;
        app.showMessage("You do not have permission to perform this action!");
});

作为参考,showProgress函数用于获取要在屏幕上显示的进度。当存档过程仍在运行时访问屏幕时也会运行它,它可以显示:

self.showProgress = function () {
        http.ajaxRequest("get", "/api/archive/getarchiveprocess")
        .done(function (result) {
            if (result.ID == -1) {
                $("#progressBar").hide();
                $("#btnArchive").show();
                if (self.Running) setTimeout(self.showProgress, 2000);
                else app.showMessage("The Archive Process has finished.");  
            }
            else {
                $("#progressBar").show();
                $("#btnArchive").hide();
                $("#progressBarInner").width(result.Progress + '%');
                $("#progressBarInner").attr("data-original-title", result.Progress + '%');
                setTimeout(self.showProgress, 2000);
            }
        });
    };

服务器端:

[HttpPost]
public void RunArchive(dynamic data) 
{ 
    // Add table row entry for the archive process for reference and progress
    // Check each tick and update tables/fields etc
    // Code omitted as very long and not needed for example
    // table row for reference edited during checks for showProgress function
}

所以我基本上都在询问控制器上的RunArchive()函数是否会继续运行,直到用户注销并以某种方式未经身份验证完成为止。我知道任何IIS,应用程序池刷新等。

2 个答案:

答案 0 :(得分:2)

听起来像web api正在做繁重的工作,一旦启动它将继续运行,无论UI方面发生了什么。

这就是说,你可以在web.config中控制webapi请求超时。

您可能想要考虑另一种选择。每当你谈论繁重的处理任务时,你最好将它们卸载到另一个服务。

您的API应该响应并且可以由用户访问,并且需要快速响应以获得更好的体验。如果你有100个用户在做繁重的工作,那么你的API基本上会崩溃。

API可以简单地将命令发送到需要运行的东西的队列,而另一个服务可以接收并执行它们。这使得您的API在工作仍在进行时保持轻量级。

你所说的归档可能涉及一个数据库,没有理由你不能做别的事情。

您可以跟踪数据库中的作业,您可以构建一个保存状态的表,一旦完成作业,外部服务就会更改数据库中的状态,然后您的UI可以显示结果。

所以API可以像这样工作:

  1. 将消息添加到队列
  2. 将作业详细信息添加到状态为“new”的数据库,以及允许将队列项链接到此记录的唯一ID。
  3. 服务B从队列中获取作业,并将db中的状态更新为“正在运行”。
  4. 作业完成,服务B将状态更新为“完成”。
  5. 用户界面会反映这些状态,以便用户知道发生了什么。
  6. 这样的事情应该会带来更好的用户体验。

    随意改变任何没有意义的东西,当你不知道需要做什么的细节时,提出建议有点困难。

    此服务B可以是Windows服务,例如您想要的其他任何可以完成工作的服务。用户权限仅在开始时起作用,仅当用户具有启动该权限的权限时才将工作项添加到队列中。这样可以确保只添加授权作业。 在此之后,服务B将不关心用户权限,并且无论用户是否登录,都将完成工作。

    这在很大程度上是猜测工作,但你应该能够知道如何做到这一点。

    如果您有更具体的要求,请将其添加到初始问题中。

答案 1 :(得分:1)

即使用户没有注销该进程,您还需要考虑IIS可以回收应用程序池,默认设置为每天一次,以及内存争用,其中任何一个都会扼杀你长时间运行的过程。

我强烈建议您查看Hangfire.io,它旨在帮助ASP.Net站点中的长时间运行进程。