-
Notifications
You must be signed in to change notification settings - Fork 8
/
ASPNetFileMonitorList.cshtml
151 lines (138 loc) · 7.34 KB
/
ASPNetFileMonitorList.cshtml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
@using System.Reflection;
@using System.Web;
@using System.Collections;
@using System.Diagnostics
@model dynamic
@{
var fileChangesMonitor = typeof(HttpRuntime)
.GetProperty("FileChangesMonitor", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)
.GetValue(null, null);
var fcnVal = fileChangesMonitor.GetType()
.GetField("_FCNMode", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(fileChangesMonitor);
var dirs = (Hashtable)fileChangesMonitor.GetType()
.GetField("_dirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(fileChangesMonitor);
var dirMonAppPathInternal = fileChangesMonitor.GetType()
.GetField("_dirMonAppPathInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(fileChangesMonitor);
var dirMonAppPathInternalName = dirMonAppPathInternal == null ? null : dirMonAppPathInternal == null ? null : dirMonAppPathInternal.GetType()
.GetField("Directory", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(dirMonAppPathInternal);
var dirMonAppPathInternalIsDirMonAppPathInternal = dirMonAppPathInternal == null ? null : dirMonAppPathInternal.GetType()
.GetField("_isDirMonAppPathInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(dirMonAppPathInternal);
var dirMonAppPathInternalDirMonCompletion = dirMonAppPathInternal == null ? null : dirMonAppPathInternal.GetType()
.GetField("_dirMonCompletion", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(dirMonAppPathInternal);
var dirMonSubdirs = fileChangesMonitor.GetType()
.GetField("_dirMonSubdirs", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(fileChangesMonitor);
var dirMonSubdirsName = dirMonSubdirs == null ? null : dirMonSubdirs.GetType()
.GetField("Directory", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(dirMonSubdirs);
var dirMonSubdirsIsDirMonAppPathInternal = dirMonSubdirs == null ? null : dirMonSubdirs.GetType()
.GetField("_isDirMonAppPathInternal", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(dirMonSubdirs);
var dirMonSubdirsDirMonCompletion = dirMonSubdirs == null ? null : dirMonSubdirs.GetType()
.GetField("_dirMonCompletion", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(dirMonSubdirs);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FCN Viewer</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" />
</head>
<body>
<div class="container body-content">
<div>
<h3>FCN Mode</h3>
<ul>
<li>This is the detected FCN Mode: @fcnVal</li>
</ul>
<h3>FileChangesMonitor directory monitor hash table</h3>
<table class="table table-striped table-bordered">
<thead>
<tr>
<td>Directory watched</td>
<td>File monitor count</td>
</tr>
</thead>
@{
var totalFileWatchers = 0;
}
@foreach (System.Collections.DictionaryEntry d in dirs)
{
var fileMons = (Hashtable) d.Value.GetType()
.GetField("_fileMons", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.GetValue(d.Value);
//I'm not sure what the difference with the result of this is, the decompiled source
//excludes file monitors that have something to do with "_cShortNames"
var fileMonsCount = d.Value.GetType()
.GetMethod("GetFileMonitorsCount", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.IgnoreCase)
.Invoke(d.Value, null);
totalFileWatchers += fileMons.Count;
<tr>
<td>@d.Key</td>
<td>@fileMons.Count</td>
</tr>
}
<tfoot>
<tr>
<td>@dirs.Count</td>
<td>@totalFileWatchers</td>
</tr>
</tfoot>
</table>
<h3>FCN Mode 'Single' dir monitor properties</h3>
<ul>
<li>FileChangesMonitor._dirMonAppPathInternal = @dirMonAppPathInternal</li>
<li>@dirMonAppPathInternalName</li>
<li>_dirMonAppPathInternal._isDirMonAppPathInternal = @dirMonAppPathInternalIsDirMonAppPathInternal</li>
<li>_dirMonAppPathInternal._dirMonCompletion = @dirMonAppPathInternalDirMonCompletion</li>
</ul>
<h3>Normal sub dir monitor properties</h3>
<ul>
<li>FileChangesMonitor._dirMonSubdirs = @dirMonSubdirs</li>
<li>@dirMonSubdirsName</li>
<li>_dirMonSubdirs._isDirMonAppPathInternal = @dirMonSubdirsIsDirMonAppPathInternal</li>
<li>_dirMonSubdirs._dirMonCompletion = @dirMonSubdirsDirMonCompletion</li>
</ul>
</div>
<div>
@{
PerformanceCounter pc1 = new PerformanceCounter("ASP.NET Applications",
"Requests Total",
"__Total__");
PerformanceCounter pc2 = new PerformanceCounter("ASP.NET",
"Application Restarts");
Type t = typeof(HttpRuntime).Assembly.GetType(
"System.Web.DirMonCompletion");
int dirMonCount = (int)t.InvokeMember("_activeDirMonCompletions",
BindingFlags.NonPublic
| BindingFlags.Static
| BindingFlags.GetField,
null,
null,
null);
// The perf client polls the server every 400 milliseconds
System.Threading.Thread.Sleep(800);
//Response.Output.WriteLine(
// "Requests={0},Restarts={1},DirMonCompletions={2}",
// pc1.NextValue(),
// pc2.NextValue(),
// dirMonCount);
}
<h3>Performance monitor properties</h3>
<ul>
<li>ASP.NET Applications - Requests Total = @pc1.NextValue()</li>
<li>ASP.NET - Application Restarts = @pc2.NextValue()</li>
<li>DirMonCompletions = @dirMonCount</li>
</ul>
</div>
</div>
</body>
</html>