如何在ASP.NET中使用HTTPModules

HTTP模块在ASP.NET请求处理管道中截取传入请求并注入预处理逻辑

如何在ASP.NET中使用HTTPModules
Thinkstock

有两种方式可以在ASP.NET应用程序的请求流水线中注入逻辑 - HTTPHANDLERS和HTTPModules。 HttpModule是ASP.NET请求处理流水线的一部分的组件,并在对应用程序所做的每个请求上调用。

请注意,HttpModules可以访问请求的生命周期事件,因此它们也可用于修改响应。 HttpModules通常用于插入在请求处理管道中的安全性,记录等中的交叉切割问题中,也可以用于URL重新编写,甚至用于在响应中创建自定义标题。

作为微软的文档状态,“HTTP模块是对应用程序所做的每个请求调用的程序集。 HTTP模块称为ASP.NET请求流水线的一部分,并在整个请求中访问生命周期事件。 HTTP模块允许您检查传入和传出请求并根据请求执行操作。“

要创建自定义httpmodule,您应该创建一个实现system.web.ihttpmodule接口的类。要创建一个httpmodule,请按照下列步骤操作:

  1. 打开Visual Studio IDE
  2. 单击文件 - >New Project
  3. 创建类库项目
  4. 向该项目添加对System.Web组件的引用
  5. 接下来,在此项目中创建一个实现IHTTPModule接口的类
  6. 写一个init方法的处理程序,以初始化模块并订阅一个或多个事件
  7. (可选)在自定义模块中实现Dispose方法

乍一看,我们的自定义httpmodule看起来像这样:

public class IDGCustomHttpModule : IHttpModule
   {
       public void Dispose()
       {
           throw new NotImplementedException();
       }
       public void Init(HttpApplication context)
       {
           throw new NotImplementedException();
       }
   }

以下代码段显示如何订阅自定义HTTP模块中的事件。

public void Init(HttpApplication context)
       {
           context.BeginRequest += new EventHandler(OnBeginRequest);
           context.EndRequest += new EventHandler(OnEndRequest);            
           context.LogRequest += new EventHandler(OnLogRequest);
       }

现在让我们为OnloGrequest方法写下代码。此方法旨在将路径或每个请求记录到文本文件。以下是onlogrequest方法应该看的方式:

public void OnLogRequest(object sender, EventArgs e)
       {
           HttpContext context = ((HttpApplication)sender).Context;
           string filePath = @"D:\IDGLog.txt";
           using (StreamWriter streamWriter = new StreamWriter(filePath))
           {
               streamWriter.WriteLine(context.Request.Path);
           }
       }

以下代码清单说明了完整的自定义HTTP模块。

public class IDGCustomModule: IHttpModule
   {
       public void Init(HttpApplication context)
       {
           context.BeginRequest += new EventHandler(OnBeginRequest);
           context.EndRequest += new EventHandler(OnEndRequest);          
           context.LogRequest += new EventHandler(OnLogRequest);
       }
       public void OnLogRequest(object sender, EventArgs e)
       {
           HttpContext context = ((HttpApplication)sender).Context;
           string filePath = @"D:\IDGLog.txt";
           using (StreamWriter streamWriter = new StreamWriter(filePath))
           {
               streamWriter.WriteLine(context.Request.Path);
           }
       }
       public void OnBeginRequest(object sender, EventArgs e)
       {
           //Write your custom code here
       }
       public void OnEndRequest(object sender, EventArgs e)
       {
           //Write your custom code here
       }
       public void Dispose()
       {
           //Write your custom code here to dispose any objects if needed
       }
   }

下一步是使用自定义HTTP模块。为此,请创建另一个项目(此时,ASP.NET应用程序项目)。首先,构建解决方案并添加到我们刚刚创建的自定义HTTP模块的引用。

接下来,您需要在Web.config文件中注册自定义HTTP模块。以下代码片段说明了如何注册自定义HTTP模块。

<system.webServer>
   <modules>
   <add name="CustomHttpModule" type="IDGModule.IDGCustomModule, IDGCustomModule" />
   </modules>
</system.webServer>

而且,这就是使用自定义HTTP模块所需的一切。

使用同步HTTP模块时,在请求处理完成之前不会释放线程。当您的自定义HTTP模块需要执行长时间运行I / O绑定操作时,这可能成为一个主要的性能瓶颈。要解决此问题,您还可以利用异步编程来实现异步HTTP模块。这将确保您的应用程序的性能在您的HTTP模块需要进行大量处理时不会降低。异步编程有助于更好地使用可用资源。

要在自定义HTTP模块中实现异步,您需要利用EventHandlertaskAsynchelper类作为.NET Framework 4.5的一部分。以下代码片段说明了如何利用此类才能订阅自定义HTTP模块的Init方法中的事件。请注意,LogRequeest方法应该返回类型任务的实例。

public void Init(HttpApplication context)
       {
           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper(LogRequest);
           context.AddOnPostAuthorizeRequestAsync(asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);
       }

以下是自定义HTTP模块的异步版本的完整代码列表。

public class IDGCustomModule: IHttpModule
   {
       public void Init(HttpApplication context)
       {
           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper(LogRequest);
      context.AddOnPostAuthorizeRequestAsync(asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);
       }
       private async Task LogRequest(object sender, EventArgs e)
       {
           HttpContext context = ((HttpApplication)sender).Context;
           string filePath = @"D:\IDGLog.txt";
            using (StreamWriter streamWriter = new StreamWriter(filePath,true))
           {
               await streamWriter.WriteLineAsync(context.Request.Path);
           }
       }
   }

如何在ASP.NET和ASP.NET核心中做更多更多:

版权© 2016 IDG通讯,Inc。