2009-11-23 6 views
7

Kann ich feststellen, wie lange ein Anwendungspool (in IIS7) abgelaufen ist (Zeit seit dem Start oder letzten Neustart) in C#?Verfügbarkeit des Anwendungspools in C#

+0

Extern oder in Ihrer ASP.NET App? –

+0

Äußerlich. Ich habe mit dem Microsoft.Web.Administration.ApplicationPool herumgespielt, aber ich sehe nichts so weit wie die Zeit. – JPero

Antwort

5

Wirklich dumm Trick erhalten: in irgendeiner Klasse, dass alles verwendet, um eine Klasse Konstruktor Erinnere dich an deine Startzeit und benutze eine aspx-Seite, um sie zu erhalten. Vergleichen Sie jetzt mit der aktuellen Zeit.

+0

Mit Klassenkonstruktor meinst du 'statischen' Konstruktor?Da der statische Konstruktor das ist, was Sie damit tun möchten, habe ich nie darüber nachgedacht, wie einfach Sie einen statischen Konstruktor verwenden können, um so etwas zu erreichen. –

+0

Yeah Klassenkonstruktor in IL = statischer Konstruktor in C#. – Joshua

+0

Die AppDomain kann wiederverwendet werden (ändern Sie web.config), ohne dass der App-Pool wiederverwendet wird (w3wp.exe-Prozess). Dieser statische Konstruktor misst nur den letzten Appdomain-Neustart. Verwenden Sie Prozessinfoantworten (@EricHumphrey), wenn Sie wirklich die Startzeit des App-Pool-Prozesses benötigen. – yzorg

3

Von der ASP.NET-Anwendung können Sie TimeSpan uptime = (DateTime.Now - ProcessInfo.GetCurrentProcessInfo().StartTime)

8

DateTime.Now -. Process.GetCurrentProcess() Starttime

Process.GetCurrentProcessInfo() existiert nicht.

+0

Interessanterweise überlebt dies einen Anwendungsneustart, daher bin ich mir nicht sicher, wie genau das ist. –

2

, wenn Sie feststellen, dass Process.GetCurrentProcessInfo() als ein anderer Benutzer nicht erwähnt existieren,

System.Diagnostics.Process.GetCurrentProcess().StartTime 

kann für Sie arbeiten.

(Ich wollte dies als Kommentar zu Eric Humphreys Beitrag hinzufügen, aber ich nicht erlaubt bin)

1

Basierend auf der oben Ich mag so eine einfache Klasse erstellt ..

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

und rief es in Application_Start() in Global.asax.cs wie

var temp = UptimeMonitor.UpTimeSeconds; 

es kann dann überall zugegriffen werden

UptimeMonitor.UpTimeSeconds 
0

Einer von zwei Ansätzen existiert, die ich persönlich benutze. Verwenden einer statischen Klasse (wie in der Antwort von @ Original10 gezeigt) oder Verwenden von Application Variablen.

Ich habe festgestellt, dass die Verwendung von Application Variablen akzeptabel ist, weil ich festgestellt habe, Process.GetCurrentProcess() überlebt Neustart der Anwendung (z. B. Änderung von web.config oder bin-Verzeichnis). Ich brauchte etwas, das für den Neustart der Website sowie sorgen würde.

In Ihrem Global.asax, fügen Sie Folgendes zu

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

In Ihrem Code, wo Sie es benötigen, können Sie so etwas wie tun könnte:

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

Welche etwas entlang der Linien von produzieren

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

Es erfolgt keine Überprüfung der Anwendungsvariablen oder Sperren der Anwendung, falls erforderlich d. Ich überlasse das dem Benutzer als Übung.