要创建自定义模块,类需要实现IHttpModule接口。这个接口定义了Init和Dispose方法。
Init方法在启动Web应用程序时调用,其参数的类型是HttpContext,可以添加应用程序处理事件。
新建类库ModuleSample,新建类SampleModule添加如下代码:
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中配置:
<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>
程序执行图:
运行时