- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个数据处理 MVC 应用程序,它处理大小从 100MB 到 2GB 不等的上传文件,并且包含几个长时间运行的操作。用户将上传文件,这些文件中的数据将被处理,最后将对数据的一些分析发送给相关用户/客户。
处理数据至少需要几个小时,因此为了确保用户不必一直等待,我启动了一个单独的任务来执行这个长时间运行的操作。这样,一旦文件被服务器接收并存储在磁盘上,用户将收到带有 ReferenceID 的响应,并且他们可以关闭浏览器。
到目前为止,它一直按预期运行良好,但在阅读了有关在 MVC 中使用即发即弃模式以及工作线程在回收期间被 IIS 丢弃的问题后,我对这种方法感到担忧。
这种方法还安全吗?如果没有,我如何确保正在处理数据的线程在完成处理并将数据发送给客户端之前不会死亡? (以一种相对简单的方式)
该应用程序在 .NET 4.5 上运行,所以不要认为我现在可以使用 HostingEnvironment.QueueBackgroundWorkItem
。
在 Controller 上使用 Async/Await 有帮助吗?
我还考虑过在文件存储到磁盘后使用应用服务器上的消息队列来存储消息,然后将 DataProcessor 设为单独的服务/进程,然后收听队列。如果队列是可恢复的,那么它将向我保证,即使服务器崩溃或线程在完成数据处理之前被丢弃,消息最终也会得到处理。这是更好的方法吗?
我当前的设置如下所示
Controller
public ActionResult ProcessFiles()
{
HttpFileCollectionBase uploadedfiles = Request.Files;
var isValid = ValidateService.ValidateFiles(uploadedFiles);
if(!isValid){
return View("Error");
}
var referenceId = DataProcessor.ProcessData(uploadedFiles);
return View(referenceId);
}
业务逻辑
public Class DataProcessor
{
public int ProcessFiles(HttpFileCollectionBase uploadedFiles)
{
var referenceId = GetUniqueReferenceIdForCurrentSession();
var location = SaveIncomingFilesToDisk(referenceId, uploadedFiles);
//ProcessData makes a DB call and takes a few hours to complete.
TaskFactory.StartNew(() => ProcessData(ReferenceId,location))
.ContinueWith((prevTask) =>
{
Log.Info("Completed Processing. Carrying on with other work");
//Below method takes about 30 mins to an hour
SendDataToRelatedClients(ReferenceId);
}
return referenceId;
}
}
引用资料
http://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html
最佳答案
Is this approach still safe?
从来都不安全。
Does using Async/Await at controller help?
没有。
The app runs on .NET 4.5, so don't think I will be able to use HostingEnvironment.QueueBackgroundWorkItem at the moment.
我有一个 AspNetBackgroundTasks library这基本上与 QueueBackgroundWorkItem
做同样的事情(有细微差别)。然而……
I've also thought of using a message queue on app server to store messages once the files are stored to disk and then making the DataProcessor a separate service/Process and then listen to the queue. If the queue is recoverable, then it will assure me that the messages will always get processed eventually even if the server crashes or the thread gets thrown away before finish processing the data. Is this a better approach?
是的。这是唯一可靠的方法。这就是我在 my blog post 中所说的“适当的分布式架构” .
关于c# - Asp.Net MVC 5 - 长时间运行的任务 - 如何确保 IIS 回收 AppPool 时工作线程不会被丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40639255/
我已使用简单的 Web 发布选项将 nopCommerce 部署为 Azure 应用服务。 然后尝试通过运行 nopCommerce 安装程序来配置安装,我收到以下错误。 The 'IIS APPPO
我正在使用以下代码通过 Kerberos 进行身份验证。 IntPtr logonToken = WindowsIdentity.GetCurrent().Token; string authenti
我根本没有做过任何Windows脚本编写,因此我对如何实现这一功能一无所知。无论如何,基本上我们想要做的是拥有一个脚本,该脚本将带一个参数来循环使用IIS AppPool。我已经在Google上进行了
我需要更改某个网站下所有/选定应用程序的应用程序池。我的 IIS 上有所有网站和应用程序池,但我无法更改它们。有什么想法吗? 这是我到目前为止所做的...这对我来说看起来很奇怪,因为只有字符串在变化,
本文为大家分享了解决IIS APPPOOL\DefaultAppPool登录失败的问题,供大家参考,具体内容如下 添加ASP.NET网站时,选择添加"添加应用程序"连接sql
我很难弄清楚如何为将文件读/写到另一台服务器的 IIS Web 应用程序设置权限。我目前正在访问 '\Server\Path\to\ReadWrite\' 被拒绝。 服务器 A 在承载 Web 应用程
我正在使用 PsEXEC 在我的 MSBuild 上运行以下 cmd。 %systemroot%\system32\inetsrv\appcmd stop apppool /apppool.name:
这是我在几个月内遇到过两次的问题。基本上,我接到一个电话,说我们的站点给出了 HTTP 错误 503,我查看了 IIS7 管理器并注意到 AppPool 已自行关闭。我重新启动它,它继续愉快地前进,直
我需要以特定身份运行 IISExpress。看完这篇文章后how to run iisexpress app pool under a different identity我在\Documents\I
在 ASP.NET 或 WCF 中使用是否安全 ServiceSecurityContext.Current.WindowsIdentity.Name获取执行当前线程的当前用户名? 我想确保在我的 W
我的 Web 应用程序有一个基于 构建的聊天应用程序模块信号机 中心。 该应用程序将有 1000+ 并发用户。我想主持聊天模块在一个单独的应用程序池上将其与我的主应用程序分开,这样 SignalR 就
我在工作中制作了一些较小的 WCF 服务,其中许多是非关键的/仅包含一些调用。我将它们发布到 IIS 服务器,每个服务器都发布到它们自己的“应用程序”。现在我已经养成了为每个应用程序创建一个新的 Ap
我正在使用 Asp.net FW 4.6。 我在同一个应用程序池下有两个应用程序,它们需要(不断地)读取一个预定义的值,该值是要更改的对象。 不能使用静态变量,因为不同的应用程序(即使在同一个应用程序
我有一个在 IIS 8 上运行的 ASP.NET 应用程序。我的应用程序有时不响应客户端记录超时的请求,然后 IIS 开始发送 503 Unavailable 响应代码。每次中断似乎持续 5 分钟,这
我有一个在 Windows 7 计算机上运行的 SQL Server 2008 R2 报表服务器以及一个 ASP.NET 应用程序。 ASP.NET 应用程序向报表服务器发出请求以显示报表列表、呈现报
我正在尝试采用安装网站的现有 MSI 并将其添加到停止 AppPool 的过程中,以便在安装更新时您不必记住在运行安装程序之前停止 AppPool。 下面列出了我设置的自定义操作 它们在 msi
我创建了一个 IIS 管理工具,旨在创建新应用程序、将它们分配到新的 AppPool,并为与该 AppPool 关联的身份添加所需的文件夹 ACL。根据this article ,每当创建新的应用程序
我创建了一个 ASP .Net MVC 3 应用程序,允许用户根据文件名搜索各种媒体文件。这些文件很多,所以我创建了一个倒排索引,并将其存储在内存中。具体来说,我将其描述为 Dictionary>.
我有一个带有六个应用程序池的网络服务器。当我想在 PerfMon 中为特定的 ASP.NET 应用程序添加计数器时,可用实例的名称非常不同。 例如,我有一个名为“FrontEnd”的应用程序池,这些是
我有一台 Win 2008 R2 Enterprise 机器,它在几个网站上运行良好,每个网站都有自己的应用程序池。 我在向 IIS AppPool\A、IIS AppPool\B 等授予权限(使用
我是一名优秀的程序员,十分优秀!