ASP.NET管道模型之HttpModule
电脑版发表于:2019/8/14 11:21
HttpModule是什么
在Http请求处理过程中,请求会前后两次通过一系列的HttpModule,这些Module对Http请求具有完全控制权,可以分别实现某个工作前的事情和某个工作后的事情。有点类似net core中的中间件,可以用来做权限控制,依赖注入,session维护,自定义路由等各种操作。httpmodule在管道模型之中很重要,如果我们去看mvc的源码,会发现里边大量的使用到了它
初识一个最简单的HttpModule
首先创建一个模块后,模块本身是不会被执行的,我们需要在web.config中进行配置
<system.webServer> <modules> <add name="checkLoginModule" type="WebApplication2.MyModule1"/> </modules> </system.webServer>
其中name就是模块的标识名字可以随便取只要不重名就好了,后面type就是模块对应的类型,运行的时候asp.net管道会取出来通过反射创建对象进行注入,这里配置的方式要注意经典模式与集成模式。
然后在模块代码中随便注册两个事件输出一句话:
public void Init(HttpApplication context) { // 下面是如何处理 LogRequest 事件并为其 // 提供自定义日志记录实现的示例 context.LogRequest += new EventHandler(OnLogRequest); context.BeginRequest += context_BeginRequest; context.AcquireRequestState += context_AcquireRequestState; } void context_BeginRequest(object sender, EventArgs e) { HttpApplication context = sender as HttpApplication; context.Response.Write("exec_context_BeginRequest<br/>"); } void context_AcquireRequestState(object sender, EventArgs e) { HttpApplication context = sender as HttpApplication; context.Response.Write("exec_context_AcquireRequestState<br/>"); }
效果如下:
这样配置方式,css,img这些静态资源也会进入模块里边,如果不想这些静态资源进入只需加一句配置:
preCondition="managedHandler"
<system.webServer> <modules> <add name="checkLoginModule" type="WebApplication2.MyModule1" preCondition="managedHandler"/> </modules> </system.webServer>
如果我们想要验证一点权限的话就很重要,拿到请求的页面以及登录信息,验证一下是否有该地方的访问权限即可
asp.net本身自带了许多HttpModule
在文件夹C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config中找到web.config:
打开后找到httpModules就可以看到自带的httpmodule:
<httpModules> <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" /> <add name="Session" type="System.Web.SessionState.SessionStateModule" /> <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" /> <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> <add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule" /> <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" /> <add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule" /> <add name="Profile" type="System.Web.Profile.ProfileModule" /> <add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" /> <add name="ScriptModule-4.0" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </httpModules>
使用代码获取系统使用的所有模块
asp.net中获取(mvc获取类似):
protected void Page_Load(object sender, EventArgs e) { //获取所有模块的名称 string[] allKeys = HttpContext.Current.ApplicationInstance.Modules.AllKeys; Response.Write("<table class='mytable'>"); Response.Write("<tr class='header'><td>模块名称</td><td>模块类型</td></tr>"); foreach (string item in allKeys) { //获取模块类型名称 string typename = HttpContext.Current.ApplicationInstance.Modules[item].ToString(); Response.Write("<tr><td>" + item + "</td><td>" + typename + "</td></tr>"); } Response.Write("</table>"); }
效果如下:
其中的checkLoginModule就是自己自定义的那个
未完待续.........
少侠,我看你气宇不凡天赋异禀,这么帅,关注一波在走呗