在Aspnet Core 2.1 Azure App Service中长期导出到excel作业

时间:2019-02-20 17:33:55

标签: asp.net-core signalr azure-functions asp.net-core-webapi azure-app-service-envrmnt

我在服务器端有一个带有AspNetCore 2.1 Web Api的angular 4应用程序(用于宁静的服务)。应用程序托管在Azure App服务中。 应用程序具有以excel格式导出数据的功能。 excel.Azure应用程序服务的超时限制为3.8分钟,预计将超过10万行。如果请求超过3.8分钟,Azure负载平衡器将取消该请求,并且用户经常会收到错误消息。 为了解决此问题,我决定将此任务移至后台进程,并将使用SingalR向用户提供更新,直到时间任务完成为止。申请流程如下

  1. 用户单击“导出到excel”按钮。
  2. AspNetCore API将处理此调用,并将请求放入Azure主题。
  3. Azure函数将订阅Azure主题,一旦收到通知,它将开始处理数据。它将从Azure SQL提取数据。
  4. Azure功能将定期与SignalR集线器讨论任务进度。 SignalR集线器会将通知推送到客户端。客户将收到此通知,并且用户将了解任务的进度。
  5. 数据准备就绪后,Azure函数将准备excel并将其发送到SignalR集线器。 SignalR集线器会将这个文件推送到客户端。

我不确定这是否正确。根据{{​​3}},应该避免长时间运行函数。 另外我读了SignalR应该避免推送文件。

有没有更好的解决方案来实现该功能,即在后台流程中将数据导出到excel并在准备好后将其推送到客户端

2 个答案:

答案 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方法将文件上传到客户端。