2009-12-24 18 views
4

Y a-t-il une propriété intégrée dans l'une des classes ASP.net qui détermine le temps de disponibilité du serveur Web sur lequel s'exécute l'application Web?Déterminer l'exécution de Windows Server via ASP.Net

Voici quelques-unes des possibilités qui me est venue à l'esprit:

  • global.asax et le Application_OnStart événement. Obtenez l'horodatage et de déterminer la disponibilité, je viens soustrais à partir DateTime.Now
  • Ecrire un service Windows (démarrage automatique) qui est le seul but est de stocker la valeur du service commencer quelque part

Mais aucun de ces deux offrent une solution "intégrée". Y a-t-il quelque chose que je pourrais superviser dans le cadre de .net?

Répondre

6

Pour obtenir le temps de fonctionnement du système, utilisez le code suivant:

TimeSpan uptime; 
using (var uptimeCounter = new PerformanceCounter("System", "System Up Time")) { 
    uptimeCounter.NextValue(); 
    uptime = TimeSpan.FromSeconds(uptimeCounter.NextValue()); 
} 

EDIT: Notez que ce ne peut pas être utilisé par du code partiellement approuvé.
Vous pouvez utiliser TimeSpan.FromMilliseconds(Environment.TickCount), mais il va envelopper après deux semaines. J'ai écrit une page d'état du serveur dans ASP.Net qui montre le temps de disponibilité du serveur et plus encore.
Voici la page entière:

<%@ Page Title="Server Stats" Language="C#" MasterPageFile="~/Admin.Master" AutoEventWireup="true" 
    CodeFile="Stats.aspx.cs" Inherits="Stats" %> 

<%@ Import Namespace="System.Diagnostics" %> 
<%@ Import Namespace="Microsoft.VisualBasic.Devices" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> 
    <style type="text/css"> 
     body { 
      background-color: #9DC0E4; 
     } 
     table.Details { 
      width: 550px; 
      margin-left: -275px; 
      left: 50%; 
      position: absolute; 
     } 
     table.Details tbody.Group { 
      border-bottom: solid black 2px; 
      margin-bottom: 15px; 
     } 
     table.Details th.Group { 
      font-size: x-large; 
      border-bottom: dashed 1px navy; 
     } 
     table.Details th.Name { 
      text-align: left; 
     } 
     table.Details td.Value { 
      text-align: right; 
     } 
    </style> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
    <% 
     var computer = new ComputerInfo(); 
     using (var iis = Process.GetCurrentProcess()) 
     using (var cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total")) 
     using (var uptime = new PerformanceCounter("System", "System Up Time")) { 
      cpu.NextValue(); 
      uptime.NextValue(); 
    %> 
    <table class="Details"> 
     <tbody class="Group"> 
      <tr> 
       <th class="Group" colspan="2">Environment</th> 
      </tr> 
      <tr> 
       <th class="Name">Local server time</th> 
       <td class="Value"> 
        <%= DateTime.Now.ToString("F")%></td> 
      </tr> 
      <tr> 
       <th class="Name">OS</th> 
       <td class="Value"> 
        <%= computer.OSFullName%><br /> 
        <%= Environment.OSVersion.ToString()%></td> 
      </tr> 
      <tr> 
       <th class="Name">Machine name</th> 
       <td class="Value"> 
        <%= Environment.MachineName%></td> 
      </tr> 
      <tr> 
       <th class="Name">User name</th> 
       <td class="Value"> 
        <%= Environment.UserName%></td> 
      </tr> 
      <tr> 
       <th class="Name">Windows domain</th> 
       <td class="Value"> 
        <%= Environment.UserDomainName%></td> 
      </tr> 
     </tbody> 
     <tbody class="Group"> 
      <tr> 
       <th class="Group" colspan="2">IIS</th> 
      </tr> 
      <tr> 
       <th class="Name">IIS Uptime</th> 
       <td class="Value"> 
        <%= (DateTime.Now- iis.StartTime).ToApproximateString()%></td> 
      </tr> 
      <tr> 
       <th class="Name">Priority</th> 
       <td class="Value"> 
        <%= iis.PriorityClass%></td> 
      </tr> 
      <tr> 
       <th class="Name">Physical Memory Used</th> 
       <td class="Value"> 
        <%= ToSizeString(iis.WorkingSet64)%></td> 
      </tr> 
      <tr> 
       <th class="Name">Virtual Memory Used</th> 
       <td class="Value"> 
        <%= ToSizeString(iis.VirtualMemorySize64)%></td> 
      </tr> 
     </tbody> 
     <tbody class="Group"> 
      <tr> 
       <th class="Group" colspan="2">Hardware</th> 
      </tr> 
      <tr> 
       <th class="Name">Processors</th> 
       <td class="Value"> 
        <%= Environment.ProcessorCount.ToString()%></td> 
      </tr> 
      <tr> 
       <th class="Name">Physical memory</th> 
       <td class="Value"> 
        <%= ToSizeString(computer.TotalPhysicalMemory)%></td> 
      </tr> 
      <tr> 
       <th class="Name">Virtual memory</th> 
       <td class="Value"> 
        <%= ToSizeString(computer.TotalVirtualMemory)%></td> 
      </tr> 
     </tbody> 
     <tbody class="Group"> 
      <tr> 
       <th class="Group" colspan="2">Performance</th> 
      </tr> 
      <tr> 
       <th class="Name">Uptime</th> 
       <td class="Value"> 
        <%= TimeSpan.FromSeconds(uptime.NextValue()).ToApproximateString()%> 
       </td> 
      </tr> 
      <tr> 
       <th class="Name">CPU Usage</th> 
       <td class="Value"> 
        <%= (cpu.NextValue()/100).ToString("p")%> 
       </td> 
      </tr> 
      <tr> 
       <th class="Name">Physical memory free</th> 
       <td class="Value"> 
        <%= ToSizeString(computer.AvailablePhysicalMemory)%></td> 
      </tr> 
      <tr> 
       <th class="Name">Virtual memory free</th> 
       <td class="Value"> 
        <%= ToSizeString(computer.AvailableVirtualMemory)%></td> 
      </tr> 
     </tbody> 
    </table> 
    <%} %> 
</asp:Content> 

ToSizeString est défini dans le fichier .cs:

protected static string ToSizeString(double bytes) { 
    var culture = CultureInfo.CurrentUICulture; 
    const string format = "#,0.0"; 

    if (bytes < 1024) 
     return bytes.ToString("#,0", culture); 
    bytes /= 1024; 
    if (bytes < 1024) 
     return bytes.ToString(format, culture) + " KB"; 
    bytes /= 1024; 
    if (bytes < 1024) 
     return bytes.ToString(format, culture) + " MB"; 
    bytes /= 1024; 
    if (bytes < 1024) 
     return bytes.ToString(format, culture) + " GB"; 
    bytes /= 1024; 
    return bytes.ToString(format, culture) + " TB"; 
} 

ToApproximateString est une méthode d'extension définie ailleurs:

public static string ToApproximateString(this TimeSpan time) { 
    if (time.TotalDays > 14) 
     return ((int)(time.TotalDays/7)).ToString("#,0.0") + " weeks"; 
    if (14 - time.TotalDays < .75) 
     return "two weeks"; 
    if (time.TotalDays > 1) 
     return time.TotalDays.ToString("#,0.0") + " days"; 
    else if (time.TotalHours > 1) 
     return time.TotalHours.ToString("#,0.0") + " hours"; 
    else if (time.TotalMinutes > 1) 
     return time.TotalMinutes.ToString("#,0.0") + " minutes"; 
    else 
     return time.TotalSeconds.ToString("#,0.0") + " seconds"; 
} 
+0

De quelle confiance doit-il bénéficier? Belle solution en passant. +1 –

+0

Il fonctionne bien sur mon hôte (LFC). – SLaks

+0

'PerformanceCounter' ne peut pas être utilisé par du code partiellement approuvé. – SLaks

0

Merci, ce fut le type de réponse que je cherchais =)

Je vais coller à

TimeSpan _diff = DateTime.Now.Subtract(Process.GetCurrentProcess().StartTime); 
this.litRuntime.Text = string.Format("{0} days and {1:00}:{2:00}:{3:00}", (int)_diff.TotalDays, _diff.Hours, _diff.Minutes, _diff.Seconds);

pour le moment.

+0

Cela ne vous donnera pas la disponibilité de l'ordinateur. – SLaks

+0

Sur mon serveur de production, cela donne 1,1 jours, alors que le temps de disponibilité du serveur est de 3 semaines. – SLaks