我有一个asp.net网络表单应用程序需要在光盘结束之前保存内存Db(在特定时间通过回收触发)。保存数据库的时间现在正在增长,有时需要超过5分钟。
我增加了#34;停机时间限制(秒)"我的应用程序池的时间为10分钟,但没有帮助。如果IIS触发回收事件或我手动执行它,它总是在5分钟后完成。
2016-04-20 19:03:44.1431 - INFO [9588]: Application_End
2016-04-20 19:03:44.1431 - INFO [9588]: Delay saving to total 444 seconds
2016-04-20 19:03:45.1462 - INFO [9588]: Delay 1 second passed
.
2016-04-20 19:08:45.1762 - INFO [9588]: Delay 301 second passed
301秒是日志中的最后一行。
为了消除任何副作用,我创建了一个新的空asp.net Web应用程序。(.NET 4.5)我只使用简单的方法,每秒记录一个新行,我能够重现相同的行为。< / p>
using System;
using System.Configuration;
using System.Linq;
using System.Threading;
using NLog;
namespace DemoApplicationLog
{
internal static class Log
{
public static Logger Instance { get; private set; }
static Log()
{
LogManager.ReconfigExistingLoggers();
Instance = LogManager.GetCurrentClassLogger();
}
}
public class Global : System.Web.HttpApplication
{
protected void Application_End(object sender, EventArgs e)
{
Log.Instance.Info("Application_End");
DelaySavingBySeconds(ConfigurationManager.AppSettings["DelaySavingBySeconds"]);
}
private static void DelaySavingBySeconds(string interval)
{
Log.Instance.Info($"Delay saving to total {interval} seconds");
var value = ConfigurationManager.AppSettings["DelaySavingBySeconds"];
if (string.IsNullOrEmpty(value))
{
interval = "0";
}
var intervalInSeconds = Convert.ToInt32(interval);
foreach (var second in Enumerable.Range(1, intervalInSeconds))
{
Thread.Sleep(1000);
Log.Instance.Info($"Delay {second} second passed");
}
Log.Instance.Info("Delaying passed!");
}
}
}
测试: 赢7,IIS 7.5.7600.16385 赢得2012R2,IIS 8.5.9600.16384
我已经使用.NET CLR Version v4.0
设置了一个新的应用程序池它是IIS错误还是可能出错?
谢谢Petr
答案 0 :(得分:0)
像许多开发人员一样,我可能会共享IIS池关闭和工作进程回收问题。而不是调整IIS中的任何设置,有几种方法可以保持进程活动,因为您的保存时间越来越长。
我将分享我在许多网站上所做的事情,以摆脱IIS回收的麻烦。
(1)我在ASP.NET线程中的IIS中运行批处理的一个特定站点。它可以运行15分钟到1/2小时。在这种特殊情况下,我将每隔10分钟ping一次站点的URL,以保持工作进程的活动状态。
(2)另一个案例,我开发了面向网站的用户,用户不想退出或超时。在这种情况下,在页面上放置一个隐藏的iFrame,并让JavaScript每15分钟发回一次页面。此工作进程永远不会关闭。 It sounds like this example may work for you.