我知道我们需要一个更好的解决方案,但我们现在需要以这种方式完成这项工作。当您在aspx网页上单击开始导入按钮时,我们有一个很长的导入过程。这需要很长时间......有时需要几个小时。我改变了超时,这很好但是我在大约一个小时后仍然收到连接服务器重置错误。我认为这是asp.net生命周期,我想知道IIS中是否有设置我可以更改以延长生命周期。
答案 0 :(得分:3)
你几乎肯定会在一个单独的进程中完成长时间运行的工作(而不仅仅是一个单独的线程)。
编写一个独立程序来执行导入。在完成时将它设置在某处(例如,数据库中的列),并将行放入日志文件或数据库表以显示进度。
这样你的页面才能开始工作。之后,它可以每隔几分钟自刷新一次,直到设置完成'标志'。如果您想确定它仍然在运行并且没有死亡,您可以显示日志表。
这是非常简单的东西,但如果您需要代码示例,则可以提供它们。
答案 1 :(得分:1)
要考虑哪一个可能解释行为的另一点是,如果消耗了太多内存,aspnet_wp.exe会回收(不要将此与页面生命周期混淆)
如果您的漫长过程占用太多内存,ASP.NET将启动一个新进程并重新分配所有现有请求。我建议检查一下。您可以通过在aspnet_wp中查看任务管理器并检查正在使用的内存大小来执行此操作 - 如果大小突然降低,则它已经回收。
您可以在machine.config中更改内存限制:
<system.web>
<processModel autoConfig="true"/>
使用memoryLimit指定允许的最大内存大小,作为ASP.NET启动新进程并重新分配现有请求之前工作进程可以使用的总系统内存的百分比。 (默认值为60)
<system.web>
<processModel autoConfig="true" memoryLimit="10"/>
如果这是导致您出现问题的原因,唯一的解决方案可能是为您的长时间操作设置单独的流程。您需要相应地设置IIS以允许您的其他EXE具有相关权限。
答案 2 :(得分:0)
您可以尝试在新线程中运行该进程。这意味着页面将启动任务,然后完成页面的处理,但单独的线程仍将在后台运行。您将无法获得任何视觉反馈,因此您可能希望将进度记录到数据库并在单独的页面中显示。
您也可以尝试将其作为ajax调用而不是具有不同限制的回发运行...
因为你认识到这不是这样做的方法,所以我不会列出其他选择。我相信你知道它们是什么:)
答案 3 :(得分:0)
延长超时绝对不是这样做的方法。响应时间应保持在绝对最小值。如果可能的话,我会尝试将这个长时间运行的任务完全从ASP.NET应用程序中移除,并让它作为一个单独的进程运行。
之后,由您决定如何继续。您可能希望进程将其结果转储到ASP应用程序可以通过AJAX或用户点击F5进行轮询的文件中。
答案 4 :(得分:0)
如果需要几个小时,我会为此建议一个单独的帖子,并且可能在准备好从服务器下载结果时发送通知(即发送链接到完成的结果)
或者如果在客户端的浏览器中有一个UI很重要(如果它们将要闲逛n小时)那么你可以使用SetInterval从客户端(JavaScript)调用WebMethod来定期检查是否它完成了。