2009-11-23 7 views
7

Existe-t-il un moyen de déterminer la durée d'un pool d'applications (dans IIS7) (depuis le démarrage ou le dernier redémarrage) dans C#?Obtenir le temps de disponibilité du pool d'applications dans C#

+0

En externe ou dans votre application ASP.NET? –

+0

Extérieurement. J'ai joué avec Microsoft.Web.Administration.ApplicationPool, mais je ne vois rien dans le temps. – JPero

Répondre

5

truc vraiment stupide: dans une classe que tout utilise, utilisez un constructeur de classe rappelez-vous votre heure de début et utilisez une page aspx pour le recevoir. Maintenant, comparez à l'heure actuelle.

+0

Par constructeur de classe, voulez-vous dire constructeur 'static'?Parce que le constructeur statique est ce que vous voulez faire avec cela, je n'ai jamais considéré avec quelle facilité vous pourriez utiliser un constructeur statique pour réaliser quelque chose comme ça avant. –

+0

Constructeur de classe Yeah dans IL = constructeur statique en C#. – Joshua

+0

L'AppDomain peut être recyclé (change web.config) sans que le pool d'applications ne soit recyclé (processus w3wp.exe). Ce constructeur statique ne mesurera que le dernier redémarrage d'appdomain. Utilisez les réponses aux informations sur le processus (@EricHumphrey) si vous avez vraiment besoin de l'heure de début du processus du pool d'applications. – yzorg

3

Dans l'application ASP.NET, vous pouvez essayer TimeSpan uptime = (DateTime.Now - ProcessInfo.GetCurrentProcessInfo().StartTime)

8

DateTime.Now -. Process.GetCurrentProcess() StartTime

Process.GetCurrentProcessInfo() n'existe pas.

+0

Fait intéressant, cela survit à un redémarrage de l'application, donc je ne suis pas sûr de la précision de ceci. –

2

si vous trouvez que Process.GetCurrentProcessInfo() n'existe pas comme un autre utilisateur mentionné,

System.Diagnostics.Process.GetCurrentProcess().StartTime 

peut travailler pour vous.

(je voulais ajouter ceci comme commentaire au poste de Eric Humphrey mais je ne suis pas autorisé)

1

Sur la base de ce qui précède, je créé une classe simple comme si ..

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

et appelé dans Application_Start() dans Global.asax.cs comme

var temp = UptimeMonitor.UpTimeSeconds; 

il peut alors être accessible à l'aide partout

UptimeMonitor.UpTimeSeconds 
0

Il existe une des deux approches que j'utilise personnellement. En utilisant une classe statique (comme indiqué dans la réponse @ Original10) ou en utilisant Application variables.

J'ai trouvé que l'utilisation de variables Application est acceptable parce que je remarquai Process.GetCurrentProcess() survive application redémarre (par exemple modification du répertoire web.config ou bin). J'avais besoin de quelque chose qui répondrait au site Web en redémarrant ainsi que.

Dans votre Global.asax, ajoutez ce qui suit à

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

Dans votre code où vous en avez besoin, vous pouvez faire quelque chose comme:

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

qui produira quelque chose le long des lignes de

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

Il n'y a pas de vérification de la variable d'application ou du verrouillage de l'application si besoin ré. Je vais laisser cela comme un exercice à l'utilisateur.

Questions connexes