C#で(IIS7の)アプリケーションプールが稼働している時間(開始からの時間、または最後の再起動)を判断する方法はありますか?
7 に答える
DateTime.Now - Process.GetCurrentProcess().StartTime
Process.GetCurrentProcessInfo()
存在しません。
本当にばかげたトリック:すべてが使用する一部のクラスでは、クラスコンストラクターを使用して開始時刻を記憶し、aspxページを使用してそれを受け取ります。次に、現在の時刻と比較します。
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); }
}
}
Global.asax.csのApplication_Start()で次のように呼び出します
var temp = UptimeMonitor.UpTimeSeconds;
その後、を使用してどこからでもアクセスできます
UptimeMonitor.UpTimeSeconds
別のユーザーが言及したようにProcess.GetCurrentProcessInfo()が存在しないことがわかった場合は、
System.Diagnostics.Process.GetCurrentProcess().StartTime
あなたのために働くかもしれません。
(これをEric Humphreyの投稿にコメントとして追加したかったのですが、許可されていません)
アプリケーションプールの再起動(リサイクル)とhttp://forums.iis.net/t/1162615.aspxをマッシュした場合は、それを取得する必要があります
私が個人的に使用している2つのアプローチのうちの1つが存在します。静的クラスの使用(@ 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.
アプリケーション変数のチェックや、必要に応じてアプリケーションのロックは行われません。これはユーザーの演習として残しておきます。