剑轩

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就是自己自定义的那个

未完待续.........


少侠,我看你气宇不凡天赋异禀,这么帅,关注一波在走呗




关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢