我有一些代码可以从SQL DB中提取数据,然后循环记录以生成一个字符串,该字符串最终将写入文本文件。
代码在我的本地VS上运行良好,但在实时服务器上,大约一分半钟后,我收到"未收到数据"错误(chrome)。代码在循环遍历数据表的过程中停止。托管支持说"连接已重置"错误被抛出。
我不确定这是超时问题还是什么。我已经在我的 web.config 中设置了执行超时(调试 = false),但它似乎没有帮助。我还检查了 Server.ScriptTimeout 属性,它确实与 web.config 中设置的 executionTimeout 值匹配。此外,超时通常会显示"页面不可用"消息。
任何建议不胜感激。
大约一分半钟后
有你的问题。 这是一个网络应用程序? 对于 Web 应用程序响应请求来说,一分半钟的时间非常长。 足够长的时间,以至于真的不值得参与各种诡计来使它成为一种工作。
您需要卸载此过程,以便与 Web 应用程序本身更加异步。 Web 应用程序的本质是它们应该收到请求并及时响应。 您在这里遇到的是一个长时间运行的过程,无法及时响应。 Web 应用程序可以促进与数据的交互,但不应直接在请求/响应中直接处理其处理。
Web 应用程序如何与流程交互? 它只是启动它,还是为开始该过程提供信息? 我建议该过程本身由Windows服务或控制台应用程序之类的东西来处理。 与 Web 应用程序分离得越多越好。 现在,由于我对过程本身一无所知,所以我对它的行为做了一些假设......
Web 应用程序可以接收启动流程的请求,以及流程所需的任何信息。 它可以将其存储在具有状态值(挂起、排队等)的数据库中,然后(及时)响应用户已收到请求并且进程已排队。 Web 应用程序可以有一个检查状态的页面,以便用户可以查看流程的运行情况(如果已启动,则经历了多少记录等)。
脱机应用程序(Windows Service等)将仅监视该数据库以处理新排队的数据。 当它看到它时,它会更新状态(正在运行、正在处理等),并通过更新该数据在过程中提供任何相关的反馈(处理的记录数等)。 因此,脱机应用程序和 Web 应用程序都与相同的数据进行交互,但不是以阻塞 Web 应用程序线程并阻止对用户响应的方式进行交互。
该过程完成后,状态将再次更新。 Web 应用程序可以显示它已完成,并提供下载结果的链接。 离线过程甚至可以在完成后向用户发送电子邮件,或者Web应用程序可以具有某种通知系统(我正在想象Facebook中的小通知图标),该系统会提醒用户注意新活动。
这样线程就不会被阻塞,用户可以继续与应用程序交互(如果甚至有任何可以与之交互的内容)等。 您还可以获得其他额外的好处。 例如,过程的结果因此保存在数据库中,并自动进行历史跟踪。
浏览器在等待响应时超时,而不是在服务器上。您无法控制浏览器为此设置的内容。你可以做的是向浏览器发送某种响应,这样它就知道你还在,并且没有以某种方式崩溃。
为此,您不能等到完成整个字符串的构建。您需要重新考虑您的代码,以便将每个添加内容写入输出流,而不是追加到字符串。这具有创建文本文件的一种更有效的方式的额外优势。为了保持浏览器的活动,您可以写出任何内容,只要返回一些数据供浏览器读取。Html注释可以为此工作。您还需要定期刷新响应流,以便您的数据不会缓冲在 Web 服务器上。否则,您可能仍会超时。
当然,这里真正的解决方案是重新考虑您的设计,这样您的操作就不会首先花费 90 秒以上。但在你能做到这一点之前,希望这是有帮助的。
确实像超时,您能否尝试通过视图返回信息,这肯定会加快速度。如果可能的话)。
当我遇到此错误时,我能够通过添加 Web.config 文件来解决它:
<system.web>
<httpRuntime executionTimeout="600" maxRequestLength="51200" />
</system.web>