要创建自定义模块,类需要实现IHttpModule接口。这个接口定义了Init和Dispose方法。
Init方法在启动Web应用程序时调用,其参数的类型是HttpContext,可以添加应用程序处理事件。
新建类库ModuleSample,新建类SampleModule添加如下代码:
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
|
using
System;
using
System.Collections.Generic;
using
System.IO;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
using
System.Web;
namespace
ModuleSample
{
public
class
SampleModule : IHttpModule
{
private
const
string
allowAddressesFile =
"AllowedAddresses.txt"
;
private
List<
string
> allowAddressesList;
public
void
Dispose()
{
throw
new
NotImplementedException();
}
public
void
Init(HttpApplication context)
{
context.LogRequest +=
new
EventHandler(OnLogRequest);
context.BeginRequest += BeginRequest;
context.PreRequestHandlerExecute += PreRequestHandlerExecute;
}
private
void
BeginRequest(
object
sender, EventArgs e)
{
LoadAddresses((sender
as
HttpApplication).Context);
}
private
void
LoadAddresses(HttpContext context)
{
if
(allowAddressesList ==
null
)
{
string
path = context.Server.MapPath(allowAddressesFile);
allowAddressesList = File.ReadAllLines(path).ToList();
}
}
private
void
PreRequestHandlerExecute(
object
sender, EventArgs e)
{
HttpApplication app = sender
as
HttpApplication;
HttpRequest request = app.Context.Request;
if
(!allowAddressesList.Contains(request.UserHostAddress))
{
throw
new
HttpException(403,
"IP address denied"
);
}
}
public
void
OnLogRequest(Object source, EventArgs e)
{
//custom logging logic can go here
}
}
}
|
在WebConfig中配置:
1
2
3
4
5
6
7
8
9
|
<system.webServer>
<handlers>
<add name=
"CustomHandler"
verb=
"*"
path=
"CallCustomHandler"
type=
"SampleHandler.CustomHandler,SampleHandler"
/>
<add name=
"InfoHandler"
verb=
"GET"
path=
"CallInfoHandler.axd"
type=
"SampleHandler.InfoHandler,SampleHandler"
/>
</handlers>
<modules>
<add name=
"SampleModule"
type=
"ModuleSample.SampleModule,ModuleSample"
/>
</modules>
</system.webServer>
|
程序执行图:
运行时