• 第七章 设计程序架构 之 设计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或者扩展名来处理请求,用处理程序比较合适;如果需要处理过程中特定的事件,用模块比较合适。

  • 相关阅读:
    十步完全理解SQL
    c#退出应用程序办法
    几个有意思的算法题
    GeoServer不同服务器安装配置、数据发布及客户端访问
    开启httpd服务的时候 显示Could not reliably determine the server`s fully qualified domain name
    Working With OpenLayers(Section 1: Creating a Basic Map)
    GeoServer地图开发解决方案(五):基于Silverlight技术的地图客户端实现
    模拟远程HTTP的POST请求
    模拟提交带附件的表单
    支付宝手机网站接口对接
  • 原文地址:https://www.cnblogs.com/stone_lv/p/4921217.html
Copyright © 2020-2023  润新知