2009-11-23 14 views
7

¿Hay alguna manera de determinar cuánto tiempo ha estado activo un grupo de aplicaciones (en IIS7) (tiempo desde el inicio o el último reinicio) en C#?Obtener Application Uptime Uptime en C#

+0

externamente, o dentro de su aplicación ASP.NET? –

+0

Externamente. He estado jugando con Microsoft.Web.Administration.ApplicationPool, pero no veo nada en el tiempo. – JPero

Respuesta

5

truco realmente estúpida: de alguna clase que utiliza todo, utilizar un constructor de la clase de recuerde su hora de inicio y use una página aspx para recibirla. Ahora compare con la hora actual. no existe Process.GetCurrentProcess() Hora de inicio

Process.GetCurrentProcessInfo() -

+0

¿Por constructor de la clase quiere decir 'constructor' estático'?Debido a que el constructor estático es lo que le gustaría hacer con esto, nunca he considerado cuán fácilmente podría usar un constructor estático para lograr algo así antes. –

+0

Sí constructor de clase en IL = constructor estático en C#. – Joshua

+0

AppDomain se puede reciclar (cambiar web.config) sin que se recicle el grupo de aplicaciones (proceso w3wp.exe). Este constructor estático solo medirá el último reinicio de appdomain. Utilice las respuestas de información de proceso (@EricHumphrey) si realmente necesita el tiempo de inicio del proceso del grupo de aplicaciones. – yzorg

3

A partir de la aplicación ASP.NET, puede intentar TimeSpan uptime = (DateTime.Now - ProcessInfo.GetCurrentProcessInfo().StartTime)

8

DateTime.Now..

+0

Curiosamente, esto sobrevive a un reinicio de la aplicación, por lo que no estoy seguro de cuán exacto es esto. –

2

si encuentra que Process.GetCurrentProcessInfo() no existe como otro usuario mencionado,

System.Diagnostics.Process.GetCurrentProcess().StartTime 

puede funcionar para usted.

(que quería añadir esto como un comentario al post de Eric Humphrey, pero no se me permite)

1

base en lo anterior he creado una clase simple como tal ..

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); } 
    } 
} 

y llamó en Application_Start() en Global.asax.cs como

var temp = UptimeMonitor.UpTimeSeconds; 

continuación, se puede acceder en cualquier lugar usando

UptimeMonitor.UpTimeSeconds 
0

Existe uno de los dos enfoques que uso personalmente. Usar una clase estática (como se muestra en la respuesta de @ Original10) o usar las variables Application.

He encontrado que el uso de Application variables es aceptable porque noté que Process.GetCurrentProcess() sobrevive al reinicio de la aplicación (por ejemplo, modificación del directorio web.config o bin). Necesitaba algo que atendiera el sitio web reiniciando y.

En su Global.asax, añada lo siguiente a

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

En su código en el que lo necesita, usted podría hacer algo como:

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." 

que producirá algo en la línea de

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

No hay comprobación de la variable de aplicación o bloqueo de la aplicación si es necesario re. Dejaré esto como un ejercicio para el usuario.