IIS应用程序池使用c#application

时间:2016-04-20 18:13:35

标签: c# asp.net iis webforms

关机时间限制(秒) - 问题

我有一个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

设置了一个新的应用程序池

事实我可以重现

  1. &#34;停机时间限制&#34;如果值大于5分钟(300秒),则忽略。
  2. &#34;停机时间限制&#34;如果值小于5分钟,则工作正常
  3. 如果我在Web.config文件和IIS回收中更改了任何内容(由更改引起),则应用程序在5分钟后 NOT 终止。
  4. 它是IIS错误还是可能出错?

    谢谢Petr

    The demo web app is available on github

1 个答案:

答案 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.