我在服务器端有一个带有AspNetCore 2.1 Web Api的angular 4应用程序(用于宁静的服务)。应用程序托管在Azure App服务中。 应用程序具有以excel格式导出数据的功能。 excel.Azure应用程序服务的超时限制为3.8分钟,预计将超过10万行。如果请求超过3.8分钟,Azure负载平衡器将取消该请求,并且用户经常会收到错误消息。 为了解决此问题,我决定将此任务移至后台进程,并将使用SingalR向用户提供更新,直到时间任务完成为止。申请流程如下
我不确定这是否正确。根据{{3}},应该避免长时间运行函数。 另外我读了SignalR应该避免推送文件。
有没有更好的解决方案来实现该功能,即在后台流程中将数据导出到excel并在准备好后将其推送到客户端
答案 0 :(得分:1)
通常在这种情况下,我们为客户提供近乎实时的解决方案。 解决此问题的方法:
1)单击按钮以导出用户数据(具有10万行或更多的excel文件)。
2)通知用户,该用户的出口申请已提交。
3)还要添加刷新按钮功能,该功能将获取文件导出的状态。
4)在后台有一个Web作业,该作业将处理您的文件,并将处理后的文件上载到azure存储器中,也许在一个Blob中。
5)一旦blob文件可用,将状态更新为完成。
6)提供一个启用链接的选项来下载文件,该文件将是您的Blob的端点网址。
这样,您的主线程将不会被锁定,并且屏幕也将响应。
如果不想使用“刷新按钮”功能来继续检查报告。可以使用signalR使连接保持活动状态,并设置一个定时选项来继续检查您的Blob文件。文件在Blob中可用后,只需更新标签即可。
希望有帮助。
答案 1 :(得分:0)
在后台流程中将数据导出到excel,并在准备好后将其推送到客户端
您可以尝试使用azure webjob to run in background and continuously或使用Azure Batch Service,以便长时间将数据导出到excel并将其存储在Storage blob中。
网站运行时,关联的作业正在运行。您可以在webjob中使用queueTrigger或httpTrigger,然后从网站调用webjob。通常,我们必须强制Azure网站保持始终在线。转到Azure网站应用程序设置,然后打开Always On
。
正如您所指出的那样: SignalR用于实时消息传递,而不是上传文件。因此,您可以使用WebClient.UploadFile方法将文件上传到客户端。