处理长任务时请求超时错误

Request timeout error while processing long tasks

我有一个 c# asp.net 管理系统,其中有一个按钮调用 SQL 服务器查询来获取 90,000 个多种语言的文本字符串,并将其分类为多个部分。这依次被排序并制作 150 个二进制文件,然后保存为 .ZIP 并将结果通过电子邮件发送给用户。处理此问题并通过电子邮件发送结果的总时间约为 6 分钟。在此期间,网页等待整个过程完成。我希望能够按下启动进程按钮,然后在我继续使用 Web 管理系统的同时允许它在后台运行,但我不确定执行此操作的最有效方法是什么。我最初创建了一个 asmx 文件,认为这会起作用,但结果是一样的,所以我现在正在查看异步和等待。任何人都可以给我任何指示,让我知道我是否在正确的轨道上。我目前没有收到任何回复让我知道该过程已成功完成,因为我可以通过向用户发送电子邮件说出了问题来处理这个问题。这是因为用户可能在任意数量的页面上。

可能有几种方法可以解决这个问题。您的选项将根据您使用的 .NET 版本而有所不同,因此我不会 post 直接编写代码;但是,您可以使用 ASMX Web 服务、WCF、MVC 等实现我描述的概念。

启动和轮询方法

这类问题的经典应对方法是实现一个StartSomething()方法和一个GetProgress()方法。使用基于 ASMX 的 Web 服务的这种方法的一个非常简单的示例 is presented here.

在示例中,一个服务方法用于在后台线程上启动进程。就我个人而言,我会通过让启动方法 return 为客户端提供一个值来识别 启动了哪个 后台进程来更改示例,因为您可以可行地同时进行多个时间.

然后客户端可以调用单独的方法来获取进度更新,并继续轮询直到过程完成。

有很多原因why you should prefer to do lengthy background processing in a non-IIS service。我建议使用 Windows 服务来保护你自己免受 IIS 的影响——在一个大的工作中随机重启你的应用程序池。

WebSockets

另一个值得您探索的选项是使用 WebSockets,它允许服务器在进程完成时联系现代浏览器。这种方法的主要优点是客户端不需要忙于轮询服务以获取更新。它的主要缺点是 WebSockets 足够新,以至于仍然有很多浏览器不能成为这种服务的客户端。

祝你好运!