扩展IIS的两种方法:模块与处理程序。
  模块,类似于以前的IIS版本中的ISAPI筛选器,它参与每个请求处理。IIS中一些现成的模块包括身份验证模块(用于处理请求的身份验证状态),压缩模块(用于压缩返回响应)以及日志记录模块(用于将有关请求的信息记录到请求日志中)。模块是一个类,该类需要实现System.Web.IHttpModule接口,然后就可以使用System.Web中的API参与asp.net的请求处理。
  处理程序,类似于以前iis版本中的ISAPI扩展,负责处理请求并生成特定内容类型的响应。处理程序是一个.NET类,该类实现ASP.NET System.Web.IHttpHandler或System.Web.IHttpAsyncHandler接口,并使用System.Web命名空间中的API 为其支持的特定内容生成http响应。

  模块和处理程序之间的主要区别在于,处理程序通常映射到特定的请求路径或扩展名,并支持该路径或扩展名所对应的特定服务器资源的处理。如果要实现的功能是处理特定的url或扩展名则使用处理程序,否则使用模块。

模块示例:

    public class ZYAuthModule : IHttpModule
    {
        public void Dispose()
        {
            //throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
            context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
        }

        private void OnPreRequestHandlerExecute(object sender, EventArgs e)
        {
            HttpApplication app = (HttpApplication)sender;
            var r = app.Context.Request;
            var u = r.Url.AbsoluteUri;
            //r.HttpMethod=="GET"  
            if (r.Cookies != null && !string.IsNullOrEmpty(r.Cookies.Get("ASP.NET_SessionId").Value))
            {
                var url = "https://auth.idscloud.com/idp/oauth2/authorize?" + $"redirect_uri={u}&state=10&client_id=&response_type=code";
                app.Context.Response.Redirect(url);
            }
        }

处理程序示例:

 public class ZYAuthHandler : IHttpHandler
    {
        public bool IsReusable => true;

        public void ProcessRequest(HttpContext context)
        {
            DateTime dt;
            String useUtc = context.Request.QueryString["utc"];
            if (!String.IsNullOrEmpty(useUtc) &&
                    useUtc.Equals("true"))
            {
                dt = DateTime.UtcNow;
            }
            else
            {
                dt = DateTime.Now;
            }
            context.Response.Write(
                String.Format("<h1>{0}</h1>",
                               dt.ToLongTimeString()
                               ));
        }
    }

 将上面的程序编译成dll后放入目标站点的bin目录下,按照一下方式进行部署:

 

 

详细可参考微软文档:https://docs.microsoft.com/en-us/iis/develop/runtime-extensibility/developing-iis-modules-and-handlers-with-the-net-framework

posted on 2019-10-30 16:06  二豆  阅读(958)  评论(0编辑  收藏  举报