ASP.NET IHttpModule 的例子
要应用这个例子,需要在web.config/machine.config里添加IHttpModule的注册。详细看DotNet SDK里的httpModules的配置节。
当然appSettings也要注册链接字符串。
1![](/Images/OutliningIndicators/None.gif)
2
/*
3
CREATE TABLE [Logs] (
4
[dt] [datetime] NOT NULL CONSTRAINT [DF_Logs_dt] DEFAULT (getdate()),
5
[SERVER_NAME] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
6
[UserHostAddress] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
7
[Path] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
8
[QueryString] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
9
[UserName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
10
[Category] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
11
[Message] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
12
CONSTRAINT [PK_Logs] PRIMARY KEY CLUSTERED
13
(
14
[dt]
15
) ON [PRIMARY]
16
) ON [PRIMARY]
17
GO
18![](/Images/OutliningIndicators/InBlock.gif)
19
CREATE TABLE [Exceptions] (
20
[dt] [datetime] NOT NULL CONSTRAINT [DF_Exceptions_dt] DEFAULT (getdate()),
21
[SERVER_NAME] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
22
[UserHostAddress] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
23
[Path] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
24
[QueryString] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
25
[UserName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
26
[Message] [nvarchar] (500) COLLATE Chinese_PRC_CI_AS NOT NULL ,
27
[ToString] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL ,
28
CONSTRAINT [PK_Exceptions] PRIMARY KEY CLUSTERED
29
(
30
[dt]
31
) ON [PRIMARY]
32
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
33
GO
34
*/
35
namespace AspNetMonitor
36
{
37
using System;
38
using System.Collections;
39
using System.Collections.Specialized;
40
using System.Configuration;
41
using System.Data;
42
using System.Data.SqlClient;
43
using System.IO;
44
using System.Threading;
45
using System.Web;
46
using System.Text;
47![](/Images/OutliningIndicators/InBlock.gif)
48
public class Module : IHttpModule
49
{
50
HttpApplication app;
51
DateTime dtstart=DateTime.Now;
52
53
System.Timers.Timer timer;
54![](/Images/OutliningIndicators/InBlock.gif)
55![](/Images/OutliningIndicators/InBlock.gif)
56
HttpContext Context
57
{
58
get
59
{
60
return app.Context;
61
}
62
}
63![](/Images/OutliningIndicators/InBlock.gif)
64
public void Init(HttpApplication application)
65
{
66
if(app!=null)throw(new InvalidOperationException());
67![](/Images/OutliningIndicators/InBlock.gif)
68
app=application;
69![](/Images/OutliningIndicators/InBlock.gif)
70
app.PreRequestHandlerExecute+=new EventHandler(app_PreRequestHandlerExecute);
71
app.PostRequestHandlerExecute+=new EventHandler(app_PostRequestHandlerExecute);
72
app.Error+=new EventHandler(app_Error);
73
}
74
public void Dispose()
75
{
76
app.PreRequestHandlerExecute-=new EventHandler(app_PreRequestHandlerExecute);
77
app.PostRequestHandlerExecute-=new EventHandler(app_PostRequestHandlerExecute);
78
app.Error-=new EventHandler(app_Error);
79
app=null;
80
}
81![](/Images/OutliningIndicators/InBlock.gif)
82
private void app_Error(object sender, EventArgs e)
83
{
84
if(timer!=null)
85
{
86
timer.Dispose();
87
timer=null;
88
}
89![](/Images/OutliningIndicators/InBlock.gif)
90
Exception x=Context.Server.GetLastError();
91
while(x is HttpUnhandledException)
92
x=x.InnerException;
93
if(x==null)return;
94![](/Images/OutliningIndicators/InBlock.gif)
95
NameValueCollection nvc=new NameValueCollection();
96![](/Images/OutliningIndicators/InBlock.gif)
97
HttpRequest request=Context.Request;
98![](/Images/OutliningIndicators/InBlock.gif)
99
nvc.Add("SERVER_NAME" ,request.ServerVariables["SERVER_NAME"]);
100
nvc.Add("UserHostAddress" ,request.UserHostAddress);
101
nvc.Add("Path" ,request.Path);
102
nvc.Add("QueryString" ,request.ServerVariables["QUERY_STRING"]);
103![](/Images/OutliningIndicators/InBlock.gif)
104
nvc.Add("UserName",Context.User.Identity.Name);
105![](/Images/OutliningIndicators/InBlock.gif)
106
nvc.Add("Message",x.Message);
107
nvc.Add("ToString",x.ToString());
108![](/Images/OutliningIndicators/InBlock.gif)
109
InsertAsync(nvc,"Exceptions");
110
}
111![](/Images/OutliningIndicators/InBlock.gif)
112
113
private void app_PreRequestHandlerExecute(object sender, EventArgs e)
114
{
115
if(timer!=null)
116
{
117
timer.Dispose();
118
timer=null;
119
}
120![](/Images/OutliningIndicators/InBlock.gif)
121
dtstart=DateTime.Now;
122![](/Images/OutliningIndicators/InBlock.gif)
123
timer=new System.Timers.Timer(10000);
124
timer.Elapsed+=new System.Timers.ElapsedEventHandler(timer_Elapsed);
125
timer.AutoReset=true;
126
timer.Start();
127
}
128![](/Images/OutliningIndicators/InBlock.gif)
129
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
130
{
131
if(timer!=null)
132
{
133
TimeSpan ts=DateTime.Now-dtstart;
134![](/Images/OutliningIndicators/InBlock.gif)
135
NameValueCollection nvc=new NameValueCollection();
136![](/Images/OutliningIndicators/InBlock.gif)
137
HttpRequest request=Context.Request;
138![](/Images/OutliningIndicators/InBlock.gif)
139
nvc.Add("SERVER_NAME" ,request.ServerVariables["SERVER_NAME"]);
140
nvc.Add("UserHostAddress" ,request.UserHostAddress);
141
nvc.Add("Path" ,request.Path);
142
nvc.Add("QueryString" ,request.ServerVariables["QUERY_STRING"]);
143![](/Images/OutliningIndicators/InBlock.gif)
144
nvc.Add("UserName",Context.User.Identity.Name);
145![](/Images/OutliningIndicators/InBlock.gif)
146
nvc.Add("Category","Handler");
147![](/Images/OutliningIndicators/InBlock.gif)
148
nvc.Add("Message",">"+ts.TotalSeconds.ToString());
149![](/Images/OutliningIndicators/InBlock.gif)
150
InsertAsync(nvc,"Logs");
151
}
152
}
153![](/Images/OutliningIndicators/InBlock.gif)
154
private void app_PostRequestHandlerExecute(object sender, EventArgs e)
155
{
156
if(timer!=null)
157
{
158
timer.Dispose();
159
timer=null;
160
}
161
}
162![](/Images/OutliningIndicators/InBlock.gif)
163
164![](/Images/OutliningIndicators/InBlock.gif)
165
static void InsertAsync(NameValueCollection nvc,string tablename)
166
{
167
new Thread(new ThreadStart(new Job(nvc,tablename).Start)).Start();
168
}
169![](/Images/OutliningIndicators/InBlock.gif)
170
class Job
171
{
172
static void AddParameter(SqlCommand cmd,string pname,string value)
173
{
174
if(value==null)
175
{
176
value="";
177
}
178
if(value.Length<4000)
179
{
180
cmd.Parameters.Add("@"+pname,SqlDbType.NVarChar,4000).Value=value;
181
return;
182
}
183
cmd.Parameters.Add("@"+pname,SqlDbType.NText).Value=value;
184
}
185![](/Images/OutliningIndicators/InBlock.gif)
186
static string _connstr;
187
static SqlConnection CreateConnection()
188
{
189
if(_connstr==null)_connstr=ConfigurationSettings.AppSettings["AspNetMonitorConnectionString"];
190
return new SqlConnection(_connstr);
191
}
192![](/Images/OutliningIndicators/InBlock.gif)
193![](/Images/OutliningIndicators/InBlock.gif)
194
NameValueCollection n;
195
string t;
196
public Job(NameValueCollection nvc,string tablename)
197
{
198
n=nvc;
199
t=tablename;
200
}
201
public void Start()
202
{
203
using(SqlConnection conn=CreateConnection())
204
{
205
using(SqlCommand cmd=conn.CreateCommand())
206
{
207
StringBuilder sb1=new StringBuilder();
208
StringBuilder sb2=new StringBuilder();
209
foreach(string key in n.Keys)
210
{
211
AddParameter(cmd,key,n[key]);
212
if(sb1.Length!=0)sb1.Append(",");
213
if(sb2.Length!=0)sb2.Append(",");
214
sb1.Append(key);
215
sb2.Append("@");
216
sb2.Append(key);
217
}
218![](/Images/OutliningIndicators/InBlock.gif)
219
cmd.CommandText="INSERT INTO "+t+" ( "+sb1+" ) VALUES ( "+sb2+" ) ";
220![](/Images/OutliningIndicators/InBlock.gif)
221
conn.Open();
222
cmd.ExecuteNonQuery();
223
conn.Close();
224
}
225
}
226
}
227
}
228![](/Images/OutliningIndicators/InBlock.gif)
229
230
}
231
}
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](/Images/OutliningIndicators/InBlock.gif)
4
![](/Images/OutliningIndicators/InBlock.gif)
5
![](/Images/OutliningIndicators/InBlock.gif)
6
![](/Images/OutliningIndicators/InBlock.gif)
7
![](/Images/OutliningIndicators/InBlock.gif)
8
![](/Images/OutliningIndicators/InBlock.gif)
9
![](/Images/OutliningIndicators/InBlock.gif)
10
![](/Images/OutliningIndicators/InBlock.gif)
11
![](/Images/OutliningIndicators/InBlock.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/InBlock.gif)
27
![](/Images/OutliningIndicators/InBlock.gif)
28
![](/Images/OutliningIndicators/InBlock.gif)
29
![](/Images/OutliningIndicators/InBlock.gif)
30
![](/Images/OutliningIndicators/InBlock.gif)
31
![](/Images/OutliningIndicators/InBlock.gif)
32
![](/Images/OutliningIndicators/InBlock.gif)
33
![](/Images/OutliningIndicators/InBlock.gif)
34
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
35
![](/Images/OutliningIndicators/None.gif)
36
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
37
![](/Images/OutliningIndicators/InBlock.gif)
38
![](/Images/OutliningIndicators/InBlock.gif)
39
![](/Images/OutliningIndicators/InBlock.gif)
40
![](/Images/OutliningIndicators/InBlock.gif)
41
![](/Images/OutliningIndicators/InBlock.gif)
42
![](/Images/OutliningIndicators/InBlock.gif)
43
![](/Images/OutliningIndicators/InBlock.gif)
44
![](/Images/OutliningIndicators/InBlock.gif)
45
![](/Images/OutliningIndicators/InBlock.gif)
46
![](/Images/OutliningIndicators/InBlock.gif)
47
![](/Images/OutliningIndicators/InBlock.gif)
48
![](/Images/OutliningIndicators/InBlock.gif)
49
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
50
![](/Images/OutliningIndicators/InBlock.gif)
51
![](/Images/OutliningIndicators/InBlock.gif)
52
![](/Images/OutliningIndicators/InBlock.gif)
53
![](/Images/OutliningIndicators/InBlock.gif)
54
![](/Images/OutliningIndicators/InBlock.gif)
55
![](/Images/OutliningIndicators/InBlock.gif)
56
![](/Images/OutliningIndicators/InBlock.gif)
57
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
58
![](/Images/OutliningIndicators/InBlock.gif)
59
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
60
![](/Images/OutliningIndicators/InBlock.gif)
61
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
62
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
63
![](/Images/OutliningIndicators/InBlock.gif)
64
![](/Images/OutliningIndicators/InBlock.gif)
65
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
66
![](/Images/OutliningIndicators/InBlock.gif)
67
![](/Images/OutliningIndicators/InBlock.gif)
68
![](/Images/OutliningIndicators/InBlock.gif)
69
![](/Images/OutliningIndicators/InBlock.gif)
70
![](/Images/OutliningIndicators/InBlock.gif)
71
![](/Images/OutliningIndicators/InBlock.gif)
72
![](/Images/OutliningIndicators/InBlock.gif)
73
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
74
![](/Images/OutliningIndicators/InBlock.gif)
75
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
76
![](/Images/OutliningIndicators/InBlock.gif)
77
![](/Images/OutliningIndicators/InBlock.gif)
78
![](/Images/OutliningIndicators/InBlock.gif)
79
![](/Images/OutliningIndicators/InBlock.gif)
80
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
81
![](/Images/OutliningIndicators/InBlock.gif)
82
![](/Images/OutliningIndicators/InBlock.gif)
83
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
84
![](/Images/OutliningIndicators/InBlock.gif)
85
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
86
![](/Images/OutliningIndicators/InBlock.gif)
87
![](/Images/OutliningIndicators/InBlock.gif)
88
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
89
![](/Images/OutliningIndicators/InBlock.gif)
90
![](/Images/OutliningIndicators/InBlock.gif)
91
![](/Images/OutliningIndicators/InBlock.gif)
92
![](/Images/OutliningIndicators/InBlock.gif)
93
![](/Images/OutliningIndicators/InBlock.gif)
94
![](/Images/OutliningIndicators/InBlock.gif)
95
![](/Images/OutliningIndicators/InBlock.gif)
96
![](/Images/OutliningIndicators/InBlock.gif)
97
![](/Images/OutliningIndicators/InBlock.gif)
98
![](/Images/OutliningIndicators/InBlock.gif)
99
![](/Images/OutliningIndicators/InBlock.gif)
100
![](/Images/OutliningIndicators/InBlock.gif)
101
![](/Images/OutliningIndicators/InBlock.gif)
102
![](/Images/OutliningIndicators/InBlock.gif)
103
![](/Images/OutliningIndicators/InBlock.gif)
104
![](/Images/OutliningIndicators/InBlock.gif)
105
![](/Images/OutliningIndicators/InBlock.gif)
106
![](/Images/OutliningIndicators/InBlock.gif)
107
![](/Images/OutliningIndicators/InBlock.gif)
108
![](/Images/OutliningIndicators/InBlock.gif)
109
![](/Images/OutliningIndicators/InBlock.gif)
110
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
111
![](/Images/OutliningIndicators/InBlock.gif)
112
![](/Images/OutliningIndicators/InBlock.gif)
113
![](/Images/OutliningIndicators/InBlock.gif)
114
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
115
![](/Images/OutliningIndicators/InBlock.gif)
116
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
117
![](/Images/OutliningIndicators/InBlock.gif)
118
![](/Images/OutliningIndicators/InBlock.gif)
119
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
120
![](/Images/OutliningIndicators/InBlock.gif)
121
![](/Images/OutliningIndicators/InBlock.gif)
122
![](/Images/OutliningIndicators/InBlock.gif)
123
![](/Images/OutliningIndicators/InBlock.gif)
124
![](/Images/OutliningIndicators/InBlock.gif)
125
![](/Images/OutliningIndicators/InBlock.gif)
126
![](/Images/OutliningIndicators/InBlock.gif)
127
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
128
![](/Images/OutliningIndicators/InBlock.gif)
129
![](/Images/OutliningIndicators/InBlock.gif)
130
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
131
![](/Images/OutliningIndicators/InBlock.gif)
132
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
133
![](/Images/OutliningIndicators/InBlock.gif)
134
![](/Images/OutliningIndicators/InBlock.gif)
135
![](/Images/OutliningIndicators/InBlock.gif)
136
![](/Images/OutliningIndicators/InBlock.gif)
137
![](/Images/OutliningIndicators/InBlock.gif)
138
![](/Images/OutliningIndicators/InBlock.gif)
139
![](/Images/OutliningIndicators/InBlock.gif)
140
![](/Images/OutliningIndicators/InBlock.gif)
141
![](/Images/OutliningIndicators/InBlock.gif)
142
![](/Images/OutliningIndicators/InBlock.gif)
143
![](/Images/OutliningIndicators/InBlock.gif)
144
![](/Images/OutliningIndicators/InBlock.gif)
145
![](/Images/OutliningIndicators/InBlock.gif)
146
![](/Images/OutliningIndicators/InBlock.gif)
147
![](/Images/OutliningIndicators/InBlock.gif)
148
![](/Images/OutliningIndicators/InBlock.gif)
149
![](/Images/OutliningIndicators/InBlock.gif)
150
![](/Images/OutliningIndicators/InBlock.gif)
151
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
152
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
153
![](/Images/OutliningIndicators/InBlock.gif)
154
![](/Images/OutliningIndicators/InBlock.gif)
155
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
156
![](/Images/OutliningIndicators/InBlock.gif)
157
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
158
![](/Images/OutliningIndicators/InBlock.gif)
159
![](/Images/OutliningIndicators/InBlock.gif)
160
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
161
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
162
![](/Images/OutliningIndicators/InBlock.gif)
163
![](/Images/OutliningIndicators/InBlock.gif)
164
![](/Images/OutliningIndicators/InBlock.gif)
165
![](/Images/OutliningIndicators/InBlock.gif)
166
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
167
![](/Images/OutliningIndicators/InBlock.gif)
168
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
169
![](/Images/OutliningIndicators/InBlock.gif)
170
![](/Images/OutliningIndicators/InBlock.gif)
171
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
172
![](/Images/OutliningIndicators/InBlock.gif)
173
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
174
![](/Images/OutliningIndicators/InBlock.gif)
175
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
176
![](/Images/OutliningIndicators/InBlock.gif)
177
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
178
![](/Images/OutliningIndicators/InBlock.gif)
179
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
180
![](/Images/OutliningIndicators/InBlock.gif)
181
![](/Images/OutliningIndicators/InBlock.gif)
182
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
183
![](/Images/OutliningIndicators/InBlock.gif)
184
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
185
![](/Images/OutliningIndicators/InBlock.gif)
186
![](/Images/OutliningIndicators/InBlock.gif)
187
![](/Images/OutliningIndicators/InBlock.gif)
188
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
189
![](/Images/OutliningIndicators/InBlock.gif)
190
![](/Images/OutliningIndicators/InBlock.gif)
191
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
192
![](/Images/OutliningIndicators/InBlock.gif)
193
![](/Images/OutliningIndicators/InBlock.gif)
194
![](/Images/OutliningIndicators/InBlock.gif)
195
![](/Images/OutliningIndicators/InBlock.gif)
196
![](/Images/OutliningIndicators/InBlock.gif)
197
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
198
![](/Images/OutliningIndicators/InBlock.gif)
199
![](/Images/OutliningIndicators/InBlock.gif)
200
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
201
![](/Images/OutliningIndicators/InBlock.gif)
202
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
203
![](/Images/OutliningIndicators/InBlock.gif)
204
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
205
![](/Images/OutliningIndicators/InBlock.gif)
206
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
207
![](/Images/OutliningIndicators/InBlock.gif)
208
![](/Images/OutliningIndicators/InBlock.gif)
209
![](/Images/OutliningIndicators/InBlock.gif)
210
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
211
![](/Images/OutliningIndicators/InBlock.gif)
212
![](/Images/OutliningIndicators/InBlock.gif)
213
![](/Images/OutliningIndicators/InBlock.gif)
214
![](/Images/OutliningIndicators/InBlock.gif)
215
![](/Images/OutliningIndicators/InBlock.gif)
216
![](/Images/OutliningIndicators/InBlock.gif)
217
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
218
![](/Images/OutliningIndicators/InBlock.gif)
219
![](/Images/OutliningIndicators/InBlock.gif)
220
![](/Images/OutliningIndicators/InBlock.gif)
221
![](/Images/OutliningIndicators/InBlock.gif)
222
![](/Images/OutliningIndicators/InBlock.gif)
223
![](/Images/OutliningIndicators/InBlock.gif)
224
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
225
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
226
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
227
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
228
![](/Images/OutliningIndicators/InBlock.gif)
229
![](/Images/OutliningIndicators/InBlock.gif)
230
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
231
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)