首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在asp.net-mvc中,在不影响其他用户的情况下执行昂贵的操作的正确方法是什么?

在asp.net-mvc中,在不影响其他用户的情况下执行昂贵的操作的正确方法是什么?
EN

Stack Overflow用户
提问于 2016-12-08 18:41:43
回答 8查看 1.2K关注 0票数 19

I asked this question大约在5年前讨论了如何在用户不需要等待的情况下“卸载”昂贵的操作(例如auditng等),以便他们更快地在前端获得响应。

我现在有一个相关但不同的问题。在我的asp.net-mvc上,我构建了一些报表页面,您可以在其中生成excel报表(i am using EPPlus)和powerpoint报表(i am using aspose.slides)。下面是一个控制器操作示例:

代码语言:javascript
复制
    public ActionResult GenerateExcelReport(FilterParams args)
    {
        byte[] results = GenerateLargeExcelReportThatTake30Seconds(args);
        return File(results, @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml", "MyReport.xlsx");
    }

该功能运行良好,但我正在尝试弄清楚这些昂贵的操作(一些报告可能需要长达30秒才能返回)是否会影响到和其他用户。在上一个问题中,我有一个昂贵的操作,用户不需要等待,但在这种情况下,他必须等待,因为它是一个同步活动(单击Generate Report,期望用户在完成时获得报告)

在这种情况下,我不关心主用户必须等待30秒,但我只想确保我不会因为这种昂贵的操作、生成文件等而对其他用户产生负面影响

对于这种用例,asp.net-mvc中有什么最佳实践吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-12-08 19:16:16

你可以尝试组合使用Hangfire和SignalR。使用Hangfire启动后台作业并放弃http请求。报告生成完成后,使用SignalR生成推送通知。

SignalR notification from server to client

备选方案是在客户端实现轮询机制。发送一个ajax调用,以使一个hangfire作业生成报告。我更喜欢使用SignalR而不是轮询。

如果报表处理正在影响web服务器上的性能,请将该处理负载转移到另一台服务器。这将使web服务器的响应速度更快。

关于您的问题的更新

在asp.net-mvc中对于这个用例有什么最佳实践吗?

你必须超时监控你的应用程序。同时监控客户端和服务器端。你可以依赖的工具很少,比如newrelic,app dynamic。该产品的名称为"NewRelic浏览器“和"NewRelic服务器”。我相信还有其他工具可以捕捉到类似的信息。

超时分析指标,如果发现任何异常,则采取适当的措施。在客户端,如果你注意到任何超时问题,连接错误,这意味着你的应用程序用户无法连接到你的应用程序,而服务器正在做一些繁重的工作。接下来,尝试确定服务器端的瓶颈。如果没有足够的空间来优化代码的性能,那么通过一些服务器容量规划练习,并弄清楚如何进一步扩展硬件或将后台作业移出web服务器以减少负载。仅仅使用这些工具捕获指标可能是不够的,您可能必须检测(日志捕获)您的应用程序以捕获额外的指标来正确地监控应用程序的健康状况。

Here您可以从微软找到一些有关.net应用程序容量规划的信息。

-Vinod。

票数 6
EN

Stack Overflow用户

发布于 2016-12-22 13:57:07

这些都是关于如何将工作移出请求/响应周期的好主意。但我认为@leora只是想知道一个长时间运行的请求是否会对asp.net应用程序的其他用户产生负面影响。

答案是否定的。asp.net是多线程的。每个请求都由单独的工作线程处理。

票数 5
EN

Stack Overflow用户

发布于 2016-12-08 19:16:35

一般来说,在后台运行长时间运行的任务,并在任务完成时向用户发出某种通知,这是一种很好的实践。您可能知道web请求的执行时间被限制为90秒,因此,如果您的长时间运行的任务可能超过此时间,您将别无选择,只能在其他线程/进程中运行。如果您使用的是.net 4.5.2,您可以使用HostingEnvironment.QueueBackgroundWorkItem在后台运行长时间运行的任务,并使用SignalR在任务完成执行时通知用户。如果你正在生成一个文件,你可以用一些唯一的ID将它存储在服务器上,并向用户发送一个下载它的链接。您可以稍后删除此文件(例如,使用某些windows服务)。

正如其他人所提到的,还有一些更高级的后台任务运行器,如Hangfire,Quartz.Net等,但总体概念是在后台运行相同的任务,并在任务完成时通知用户。下面是关于运行后台任务的不同操作的一些不错的article

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41037423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档