Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>If you're trying to get the stats of the client's computer, give up; it's impossible. (Unless you write a browser plugin, which you <em>really</em> shouldn't)</p> <p>If you're trying to get the stats of your web server, it's very possible.</p> <p>Here is my implementation of such a page:</p> <pre><code>&lt;%@ Page Title="Server Stats" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeFile="Stats.aspx.cs" Inherits="Stats" %&gt; &lt;%@ Import Namespace="System.Diagnostics" %&gt; &lt;%@ Import Namespace="Microsoft.VisualBasic.Devices" %&gt; &lt;asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"&gt; &lt;style type="text/css"&gt; 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; } &lt;/style&gt; &lt;/asp:Content&gt; &lt;asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"&gt; &lt;% 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(); %&gt; &lt;table class="Details"&gt; &lt;tbody class="Group"&gt; &lt;tr&gt; &lt;th class="Group" colspan="2"&gt;Environment&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Local server time&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= DateTime.Now.ToString("F")%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;OS&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= computer.OSFullName%&gt;&lt;br /&gt; &lt;%= Environment.OSVersion.ToString()%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Machine name&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= Environment.MachineName%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;User name&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= Environment.UserName%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Windows domain&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= Environment.UserDomainName%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;tbody class="Group"&gt; &lt;tr&gt; &lt;th class="Group" colspan="2"&gt;IIS&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;IIS Uptime&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= (DateTime.Now- iis.StartTime).ToApproximateString()%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Priority&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= iis.PriorityClass%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Physical Memory Used&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= ToSizeString(iis.WorkingSet64)%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Virtual Memory Used&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= ToSizeString(iis.VirtualMemorySize64)%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;tbody class="Group"&gt; &lt;tr&gt; &lt;th class="Group" colspan="2"&gt;Hardware&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Processors&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= Environment.ProcessorCount.ToString()%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Physical memory&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= ToSizeString(computer.TotalPhysicalMemory)%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Virtual memory&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= ToSizeString(computer.TotalVirtualMemory)%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;tbody class="Group"&gt; &lt;tr&gt; &lt;th class="Group" colspan="2"&gt;Performance&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Uptime&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= TimeSpan.FromSeconds(uptime.NextValue()).ToApproximateString()%&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;CPU Usage&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= (cpu.NextValue()/100).ToString("p")%&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Physical memory free&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= ToSizeString(computer.AvailablePhysicalMemory)%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;th class="Name"&gt;Virtual memory free&lt;/th&gt; &lt;td class="Value"&gt; &lt;%= ToSizeString(computer.AvailableVirtualMemory)%&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;%} %&gt; &lt;/asp:Content&gt; </code></pre> <p><code>ToSizeString</code> is defined in the <code>.cs</code> file:</p> <pre><code>protected static string ToSizeString(double bytes) { var culture = CultureInfo.CurrentUICulture; const string format = "#,0.0"; if (bytes &lt; 1024) return bytes.ToString("#,0", culture); bytes /= 1024; if (bytes &lt; 1024) return bytes.ToString(format, culture) + " KB"; bytes /= 1024; if (bytes &lt; 1024) return bytes.ToString(format, culture) + " MB"; bytes /= 1024; if (bytes &lt; 1024) return bytes.ToString(format, culture) + " GB"; bytes /= 1024; return bytes.ToString(format, culture) + " TB"; } </code></pre> <p><code>ToApproximateString</code> is an extension method defined elsewhere:</p> <pre><code>public static string ToApproximateString(this TimeSpan time) { if (time.TotalDays &gt; 14) return ((int)(time.TotalDays / 7)).ToString("#,0.0") + " weeks"; if (14 - time.TotalDays &lt; .75) return "two weeks"; if (time.TotalDays &gt; 1) return time.TotalDays.ToString("#,0.0") + " days"; else if (time.TotalHours &gt; 1) return time.TotalHours.ToString("#,0.0") + " hours"; else if (time.TotalMinutes &gt; 1) return time.TotalMinutes.ToString("#,0.0") + " minutes"; else return time.TotalSeconds.ToString("#,0.0") + " seconds"; } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload