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

用户1166905

为了给出这个问题的上下文,我们有一个 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 可以这样工作:

  1. 将消息添加到队列
  2. 将作业详细信息添加到数据库,例如状态为“新”和一个允许队列项链接到此记录的唯一 ID。
  3. 服务 B 从队列中提取作业并将 db 中的状态更新为“正在运行”。
  4. 作业完成并且服务 B 将状态更新为“完成”。
  5. UI 反映了这些状态,因此用户知道发生了什么。

我认为这样的事情应该会带来更好的用户体验。

没有意义的就随意更改,当你不知道需要做什么的细节时,给出建议有点困难。

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

这主要是在这一点上的猜测工作,但您应该能够了解如何做到这一点。

如果您有更具体的要求,您应该将这些添加到最初的问题中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在服务器端在ASP.NET项目中运行代码

ASP.NET MVC服务器端打印

ASP.NET图表在服务器端崩溃

如何从服务器端代码asp.net输入ListBox项

客户可以看到服务器端的源代码吗?asp.net

无法从服务器端ASP.NET代码打开Bootstrap模态窗口

无法在服务器中运行asp.net Core,Angular 2,服务器端渲染项目

Blazor,ASP.NET Core托管与ASP.NET Core中的服务器端

用于客户端和服务器端验证的 ASP.NET Core 重用代码

从javascript或代码隐藏C#函数ASP.NET调用服务器端C#函数

如何在 Asp.Net 的代码隐藏文件中访问服务器端控件?

如何使用TextMode =“ Date”将服务器端代码中的值设置为asp.net TextBox?

哪里将“服务器端”代码放在应定期执行的asp.net项目中?

ASP和ASP.Net支持哪些服务器端脚本语言

asp.net/javascript创建cookie,创建客户端或服务器端的优势?

在ASP.NET服务器端还是客户端中的HTML控件?

ASP.NET服务器端或客户端的验证控件?

ASP.Net MVC客户端和服务器端计算

如何使用asp.net访问服务器端的客户端文件

不从服务器端 ASP.NET 应用程序打印 PDF 文档

从ASP.NET服务器端在Bootstrap模态中向div添加内容

asp.NET动态按钮服务器端事件不起作用

ASP .NET Core更新页面服务器端,无需刷新

在ASP.NET的服务器端验证Recaptcha 2(无验证码reCAPTCHA)

ASP.NET Core MVC 2:NameValueCollection 实例在服务器端为空

如何使用ASP.NET发送FormData并在服务器端处理它

服务器端变量的 ASP.NET (UserControl) 语法错误

asp.net加载服务器端网址,但不打开页面或窗口

Blazor服务器端的Asp.Net核心身份