为了给出这个问题上下文,我们有一个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,应用程序池刷新等。
答案 0 :(得分:2)
听起来像web api正在做繁重的工作,一旦启动它将继续运行,无论UI方面发生了什么。
这就是说,你可以在web.config中控制webapi请求超时。
您可能想要考虑另一种选择。每当你谈论繁重的处理任务时,你最好将它们卸载到另一个服务。
您的API应该响应并且可以由用户访问,并且需要快速响应以获得更好的体验。如果你有100个用户在做繁重的工作,那么你的API基本上会崩溃。
API可以简单地将命令发送到需要运行的东西的队列,而另一个服务可以接收并执行它们。这使得您的API在工作仍在进行时保持轻量级。
你所说的归档可能涉及一个数据库,没有理由你不能做别的事情。
您可以跟踪数据库中的作业,您可以构建一个保存状态的表,一旦完成作业,外部服务就会更改数据库中的状态,然后您的UI可以显示结果。
所以API可以像这样工作:
这样的事情应该会带来更好的用户体验。
随意改变任何没有意义的东西,当你不知道需要做什么的细节时,提出建议有点困难。
此服务B可以是Windows服务,例如您想要的其他任何可以完成工作的服务。用户权限仅在开始时起作用,仅当用户具有启动该权限的权限时才将工作项添加到队列中。这样可以确保只添加授权作业。 在此之后,服务B将不关心用户权限,并且无论用户是否登录,都将完成工作。
这在很大程度上是猜测工作,但你应该能够知道如何做到这一点。
如果您有更具体的要求,请将其添加到初始问题中。
答案 1 :(得分:1)
即使用户没有注销该进程,您还需要考虑IIS可以回收应用程序池,默认设置为每天一次,以及内存争用,其中任何一个都会扼杀你长时间运行的过程。
我强烈建议您查看Hangfire.io,它旨在帮助ASP.Net站点中的长时间运行进程。