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