0

我知道我们需要一个更好的解决方案,但我们现在需要以这种方式完成。当您单击 aspx 网页上的开始导入按钮时,我们有一个很长的导入过程。这需要很长时间..有时需要几个小时。我更改了超时,这很好,但大约一个小时后我不断收到连接服务器重置错误。我认为这是 asp.net 生命周期,我想知道 IIS 中是否有设置可以更改以延长此生命周期。

4

5 回答 5

3

您几乎肯定应该在一个单独的进程(而不仅仅是一个单独的线程)中完成长时间运行的工作。

编写一个独立的程序来进行导入。完成后让它在某处设置一个标志(例如数据库中的一列),并将行放入日志文件或数据库表中以显示进度。

这样你的页面就可以开始工作了。之后,它可以每隔几分钟自我刷新一次,直到设置“完成”标志。如果您想确保它仍在运行并且没有死,您可以显示日志表。

这是非常简单的东西,但是如果您需要代码示例,可以提供它们。

于 2010-04-13T04:09:17.703 回答
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 相关权限。

于 2010-01-10T13:40:02.060 回答
0

Extending the timeout is definitely not the way to do it. Response times should be kept to an absolute minimum. If at all possible, I would try to shift this long-running task out of the ASP.NET application entirely and have it run as a separate process.

After that it's up to you how you want to proceed. You might want the process to dump its results into a file that the ASP application can poll for, either via AJAX or having the user hit F5.

于 2010-01-09T22:44:57.730 回答
0

您可以尝试在新线程中运行该进程。这意味着页面将启动任务,然后完成页面的处理,但单独的线程仍将在后台运行。但是,您将无法获得任何视觉反馈,因此您可能希望将进度记录到数据库中并将其显示在单独的页面中。

您也可以尝试将其作为 ajax 调用而不是具有不同限制的回发来运行......

由于您认识到这不是这样做的方法,因此我不会列出替代方案。我确定你知道它们是什么:)

于 2010-01-09T22:39:40.483 回答
0

如果这需要几个小时,我会为此建议一个单独的线程,并可能在准备好从服务器下载结果时通过电子邮件发送通知(即发送指向完成结果的链接)

或者,如果在客户端的浏览器中拥有一个 UI 很重要(如果它们要在周围闲逛 n 小时),那么您可以拥有一个 WebMethod,它使用 SetInterval 从客户端(JavaScript)调用,以定期检查它是否完成。

于 2010-01-10T00:54:56.727 回答