Получите время работы пула приложений в C#

Есть ли способ, которым я могу определить, как долго пул приложений (в IIS7) был запущен (время с момента запуска или последнего перезапуска) в C#?

7 ответов

Решение

Действительно глупый трюк: в каком-то классе, который все использует, используйте конструктор класса, чтобы запомнить время запуска, и используйте страницу aspx для его получения. Теперь сравните с текущим временем.

DateTime.Now - Process.GetCurrentProcess().StartTime

Process.GetCurrentProcessInfo() не существует

Из приложения ASP.NET вы можете попробовать TimeSpan uptime = (DateTime.Now - ProcessInfo.GetCurrentProcessInfo ().StartTime)

Исходя из вышеизложенного, я создал простой класс, например...

public static class UptimeMonitor
{
    static DateTime StartTime { get; set; }

    static UptimeMonitor()
    {
        StartTime = DateTime.Now;
    }

    public static int UpTimeSeconds
    {
        get { return (int)Math.Round((DateTime.Now - StartTime).TotalSeconds,0); }
    }
}

и вызвал его в Application_Start() в Global.asax.cs как

var temp = UptimeMonitor.UpTimeSeconds;

Затем он может быть доступен в любом месте с помощью

UptimeMonitor.UpTimeSeconds

Если вы обнаружите, что Process.GetCurrentProcessInfo() не существует, как упоминалось другим пользователем,

System.Diagnostics.Process.GetCurrentProcess().StartTime

может работать на вас.

(Я хотел добавить это как комментарий к сообщению Эрика Хамфри, но мне не разрешено)

Существует один из двух подходов, которые я лично использую. Использование статического класса (как показано в ответе @Original10) или использование Application переменные.

Я обнаружил, что с помощью Application переменные приемлемы, потому что я заметил Process.GetCurrentProcess() переживает перезапуски приложения (например, изменение web.config или каталога bin). Мне нужно было что-то, что также помогло бы перезагрузить сайт.

В вашем Global.asax добавьте следующее

public void Application_Start(Object sender, EventArgs e)
{
  ...
  Application["ApplicationStartTime"] = DateTime.Now.ToString("o");
}

В вашем коде, где вам это нужно, вы можете сделать что-то вроде:

var appStartTime = DateTime.MinValue;
var appStartTimeValue = Web.HttpCurrent.Application["ApplicationStartTime"].ToString();

DateTime.TryParseExact(appStartTimeValue, "o", null, Globalization.DateTimeStyles.None, Out appStartTime);
var uptime = (DateTime.Now - appStartTime).TotalSeconds

var lsOutput = $"Application has been running since {appStartTime:o} - {uptime:n0} seconds."

Который будет производить что-то вроде

Application has been running since 2018-02-16T10:00:56.4370974+00:00 - 10,166 seconds.

При необходимости не выполняется проверка переменной приложения или блокировки приложения. Я оставлю это в качестве упражнения для пользователя.

Если вы помяли Перезапуск (Переработка) пула приложений и http://forums.iis.net/t/1162615.aspx, вы должны получить его

Другие вопросы по тегам