6

我有一些代码从 SQL DB 中提取数据,然后遍历记录以生成一个字符串,最终将其写入文本文件。

代码在我的本地上运行良好,来自 VS,但在实时服务器上,大约一分半钟后,我收到“未收到数据”错误(chrome)。代码在循环数据表的中间停止。托管支持说“连接已重置”错误被抛出。

我不确定这是超时问题还是什么。我在 web.config 中设置了 executionTimeout(使用 debug = false),但它似乎没有帮助。我还检查了 Server.ScriptTimeout 属性,并且它确实与 web.config 中设置的 executionTimeout 值匹配。此外,超时通常会给出“页面不可用”消息。

任何建议表示赞赏。

4

4 回答 4

6

大约一分半钟后

有你的问题。这是一个网络应用程序?对于 Web 应用程序响应请求来说,一分半钟是很长的时间。足够长的时间,它不值得参与各种诡计来使它成为一种工作。

您将希望卸载此过程,使其与 Web 应用程序本身更加异步。Web 应用程序的本质是它们应该接收请求并及时响应。您在这里拥有的是一个长期运行的过程,无法及时响应。Web 应用程序可以促进与数据的交互,但不应直接在请求/响应中直接处理其处理。

Web 应用程序如何与流程交互?它只是启动它,还是为启动过程提供信息?我建议该过程本身由 Windows 服务或控制台应用程序之类的东西处理。与 Web 应用程序分离得越多越好。现在,由于我对过程本身一无所知,我正在对其行为做出一些假设......

Web 应用程序可以接收启动流程的请求以及流程所需的任何信息。它可以将其与状态值(待处理、排队等)一起存储在数据库中,然后(及时)响应用户已收到请求并且进程已排队。Web 应用程序可以有一个检查状态的页面,以便用户可以看到进程是如何进行的(如果它已启动,它经过了多少条记录等)。

离线应用程序(Windows 服务等)只会监视该数据库以查找要处理的新排队数据。当它看到它时,它会更新状态(运行、处理等)并通过更新该数据在此过程中提供任何相关反馈(处理的记录数等)。因此,离线应用程序和 Web 应用程序都在与相同的数据进行交互,但不会以阻塞 Web 应用程序的线程并阻止对用户的响应的方式进行交互。

当该过程完成时,再次更新状态。Web 应用程序可以显示它已完成并提供下载结果的链接。离线过程甚至可以在完成后向用户发送电子邮件,或者 Web 应用程序可以具有某种通知系统(我正在描绘 Facebook 中的小通知图标),它会提醒用户注意新活动。

这样线程就不会被阻塞,用户可以继续与应用程序交互(如果有任何可以交互的东西)等等。而且你还可以获得其他额外的好处。例如,过程的结果因此保存在数据库中并自动进行历史跟踪。

于 2012-07-02T17:43:05.880 回答
3

听起来是浏览器超时等待响应,而不是在服务器上。您无法控制浏览器为此设置的内容。您可以做的是向浏览器发送某种响应,以便它知道您仍然在附近并且没有以某种方式崩溃。

为此,您不能等到完成整个字符串的构建。您需要重新考虑您的代码,以便将每个添加内容写入输出流,而不是附加到字符串。这具有一个额外的优势,即是一种更有效的方式来创建您的文本文件。为了使浏览器保持活动状态,您可以写出任何内容,只要有一些数据返回供浏览器读取。Html 注释可以解决这个问题。您还需要定期刷新您的响应流,这样您的数据就不会被缓冲在您的 Web 服务器上。否则你可能仍然超时。

当然,这里真正的解决方案是重新考虑您的设计,这样您的操作就不会首先花费 90 秒以上。但在你能做到这一点之前,希望这会有所帮助。

于 2012-07-02T18:09:48.037 回答
0

听起来确实像超时,您能否尝试通过视图返回信息,这肯定会加快速度。(如果可能的话)。

于 2012-07-02T17:38:57.393 回答
0

当我遇到此错误时,我可以通过添加 Web.config 文件来解决它:

<system.web>
    <httpRuntime executionTimeout="600" maxRequestLength="51200"  />
</system.web>
于 2015-07-17T20:49:39.850 回答