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