2009-12-24 3 views
4

Есть ли встроенное свойство в любом из классов ASP.net, которое определяет, что работает время работы веб-сервера, на котором работает веб-приложение?Определить время выполнения Windows Server через ASP.Net

Вот некоторые из возможностей, что пришло мне в голову:

  • global.asax и Application_OnStart событие. Получить метку времени и определить время безотказной работы, я просто вычитаем его из DateTime.Now
  • Написать обслуживание окон (автоматический запуск), который только цель сохранить значение службы начинают где-то

Но ни один из эти два предлагают «встроенное» решение. Есть ли что-то, что я мог бы наблюдать в рамках .net?

ответ

6

Чтобы получить безотказной работы системы, используйте следующий код:

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

EDIT: Обратите внимание, что это не может быть использован частично доверенным кодом.
Вы можете использовать TimeSpan.FromMilliseconds(Environment.TickCount), но он пройдет через две недели.


Я написал страницу состояния сервера в ASP.Net, которая показывает время безотказной работы сервера и многое другое.
Здесь вся страница:

<%@ 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 определяется в файле .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 является метод расширения определяется в другом месте:

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

Какое доверие должно выполняться? Хорошее решение кстати. +1 –

+0

Он отлично работает на моем хосте (LFC). – SLaks

+0

'PerformanceCounter' не может использоваться частично доверенным кодом. – SLaks

0

Спасибо, что было вид ответа я искал =)

Я буду придерживаться

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

на данный момент.

+0

Это не даст вам время работы компьютера. – SLaks

+0

На моем сервере производства это дает 1,1 дня, тогда как время работы сервера составляет 3 недели. – SLaks