第七章 设计程序架构 之 设计HTTP模块和处理程序

1. 概述

  HTTP模块和处理程序,可以让程序员直接跟HTTP请求交互。

  本章内容包括 实现同步和异步模块及处理程序以及在IIS中如何选择模块和处理程序。

2. 主要内容

  2.1 实现同步和异步模块及处理程序

    模块(Module)在处理程序执行操作之前或者之后被调用,开发人员可以藉此来操作每一次请求操作。

    创建Http模块需要实现  System.Web.IHttpModule 接口,它包含两个方法: void Init(HttpApplication) 和  void方法 Dispose。

    System.Web.HttpApplication 包含 22 个事件,可供模块根据需求去灵活操作。

    Web.Config中的httpModule节点可以用来在程序中配置http模块。

    一般的程序处理流程是:验证、URL映射、一系列事件、处理程序、一系列事件。

    Global.asax文件的核心功能就是处理应用程序事件。

    不同于模块,只有一个处理程序被用来处理一个请求。处理程序必须实现IHttpHandler接口。

    ASP.NET4.5允许同时编写模块和处理程序来处理异步请求。

private async Task ScrapePage(object caller, EventArgs e)  
{  
    WebClient webClient = new WebClient(); 
    var downloadresult = await webClient.DownloadStringTaskAsync("http://www.msn.com");  
} 
 
public void Init(HttpApplication context)  
{ 
    EventHandlerTaskAsyncHelper helper =   
            new EventHandlerTaskAsyncHelper(ScrapePage);  
    context.AddOnPostAuthorizeRequestAsync( 
                    helper.BeginEventHandler, helper.EndEventHandler);  
}

    *使用同步模块,主线程处理整个请求,包括处理程序和模块。同一时间只能处理一个请求,而且如果当前出现数据库错误或者I/O错误,整个程序都会受影响。

    通过实现HttpTaskAsyncHandler,可以方便的实现异步处理。

public class NewAsyncHandler : HttpTaskAsyncHandler  
{  
        public override async Task ProcessRequestAsync(HttpContext context)  
        {  
           WebClient webClient = new WebClient(); 
           var downloadresult = await   
                   webClient.DownloadStringTaskAsync("http://www.msn.com");  
        }  
}

  2.2 在IIS中选择使用模块还是处理程序

    Http处理程序根据请求文件的扩展名来判断处理方式,而Http模块是基于事件的处理方式。

    抉择的依据是你需要 根据Url或者扩展名来处理请求 还是 根据一系列的规则来处理请求。

    如果需要根据URL,那就用Http处理程序。如果要实现一个事件驱动的平台,那就用Http模块。

3. 总结

  ① HTTP模块和处理程序可以插入到IIS的请求处理流程中。

  ② 同步模块包含一个init方法,可以用来给附加到请求过程中的事件设置处理程序。

  ③ 异步模块稍微复杂一些,但是使用async、await以及Task 可以方便的处理耗时过程。

  ④ 处理程序可以根据特定的URL/extension来处理请求。可以同步也可以异步,取决于其扩展的基类。

  ⑤ 如果需要根据特定的URL或者扩展名来处理请求,用处理程序比较合适;如果需要处理过程中特定的事件,用模块比较合适。

原文地址:https://www.cnblogs.com/stone_lv/p/4921217.html