使用.NET Framework开发IIS 7.0模块和处理程序拦截请求实现跳转

  扩展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

相关文章