为了给出这个问题的上下文,我们有一个 ASP.Net MVC 项目,它要求您通过身份验证才能使用系统(典型的 saas 产品)。该项目包括一个不活动计时器,如果用户离开屏幕太久,它将注销用户。该项目是一个 SPA 类型的项目,使用 Web API 来获取/发布相关数据。
我目前必须开发一个例程来存档潜在的大量数据,并且该过程本身很好。我不确定的是,一旦进程启动,一个帖子被发送到 web api 并且服务器端代码开始运行,如果发生不活动超时或用户出于某种原因手动注销,它是否继续运行?
我认为会,但我不喜欢依赖假设。
编辑:例如对于下面的评论/答案。Screen 将有一个他们希望存档的数据的复选框列表,因此不是一组数据列表,因此该项目确实需要处理任务。
以下代码在运行时位于客户端(省略检查等,数据变量包含刻度的所有真/假值):
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、应用程序池刷新等都会。
听起来 web api 是一个做繁重工作的人,一旦开始,它就会继续运行,无论 UI 方面发生什么事情。
话虽如此,您可以在 web.config 中控制 webapi 请求的超时。
您可能需要考虑另一种选择。每当您谈论繁重的处理任务时,最好将其卸载到其他服务。
你的 API 应该是响应式的,并且可以被你的用户访问,它需要快速响应以提供更好的体验。如果你有 100 个用户在做繁重的工作,你的 API 基本上会崩溃。
API 可以简单地将命令发送到需要运行的内容队列,另一个服务可以接收它们并执行它们。这使您的 API 在工作仍在完成时保持轻量级。
您正在谈论可能涉及数据库的存档,并且没有理由不能让其他东西来完成这项工作。
您可以跟踪数据库中的作业,您可以构建一个保存状态的表,一旦作业完成,外部服务会更改数据库中的状态,然后您的 UI 可以显示结果。
所以 API 可以这样工作:
我认为这样的事情应该会带来更好的用户体验。
没有意义的就随意更改,当你不知道需要做什么的细节时,给出建议有点困难。
例如,此服务 B 可以是 Windows 服务,也可以是您想要的任何其他可以完成这项工作的服务。用户权限仅在开始时起作用,只有当用户有权启动该工作项时,才会将工作项添加到队列中。这使您可以确定只添加了授权作业。之后,服务 B 将不再关心用户权限,无论用户是否登录,都会将工作做到底。
这主要是在这一点上的猜测工作,但您应该能够了解如何做到这一点。
如果您有更具体的要求,您应该将这些添加到最初的问题中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句