好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>高手进阶
<tfoot draggable='sEl'></tfoot>

ASP.NET 之 自定义 异步HTTP处理程序

ASP.NET 之 自定义 异步HTTP处理程序

ASP.NET 之 自定义 异步HTTP处理程序

  一、前言

    1.对读者想说的话: (可跳过)

    在此我 感谢 那些看了 《ASP.NET 之 自定义 同步HTTP处理程序》 这篇文章以及看到了这篇 《ASP.NET 之 自定义 异步HTTP处理程序》 的亲们。前面的那篇可能看过 MSDN 的亲们一定会发现很多 熟悉 的地方。而我其实就是比较详细的介绍了一下,让大家更好的理解      

     PS: MSDN从头到尾都是文字且文字很统一,恐怕很多人都感觉畏惧,懒的去看,所以我将其重要的部分提取出来,使用易懂的例子和简洁的语言来叙述。当然其中也免不了错误,希望各位亲们可以指出。

    2.正式的开始

     前面我们学习了关于关于自定义同步 HTTP 处理程序,相信大家可能感觉有所成就 (大牛们可能会觉得so easy) 。但是这种同步的机制只能对付客户访问较少的情况或者数据处理量不大的情况 (每次申请一个同步HTTP处理程序都会新建一个新的线程来处理,当申请量很大时,线程将会被堵塞,致使服务器性能低下,甚至宕机) 。而今天这篇文章就是解决同步 HTTP 处理程序的这个 致命缺点 ,有效的使用服务器的资源。

     PS: 异步( 仅限在本文章下的情况 ): 简单来说就是一部分操作在使用我们自己创建的线程,另一部分操作由操作系统调用自身的线程有条不紊的处理,这样我们可以将简单的处理由我们自身的线程完成,而复杂的处理则交给系统管理的线程来处理。因为这些线程是系统管理的所以不会出现卡死的情况,系统内部会自动的管理。当然系统会通过通知的方式告知我们的自己的线程该处理已经完成,这样我们就可以避免使用多线程技术,却难于管理的问题。

   以下为 图例:

   

   二、注册与绑定 (虽然前一篇已经讲述过,但是在这里仍然重新再讲一次)

     为什么要有这两部呢?而且还是要注册与绑定这两个呢?

     答案是 你只写一个类 vs是不可能知道你这个东西是干什么的,所以我们需要在 web.config 中注册我们自定义的HTTP处理程序。而绑定则是让iis知道我们这个站点中含有一个自定义的HTTP处理程序。(下面我将以 iis7 为例说明如何绑定)

     1.注册

 1   <  configuration  > 
 2     <  system.web  > 
 3       <  httpHandlers  > 
 4        <  add   verb  ="*"   path  ="<!--  这里写需要绑定的客户端申请的页面(*.smm,*.ffs,web1.ffe) -->"   type  ="<!-- 这里写处理程序的类名 -->" 
 5       </httpHandlers  > 
 6     </  system.web  > 
 7   </  configuration  > 


   以上需要自行编写的部分我都已使用注释写好

   2.绑定 ( iis7 )

      1) 打开 iis7 -》 打开  网站  节点 -》 点击你的网站的名称

      2) 双击  

      3) 点击

     4) 

      5) 最后点击 确定 这样在 iis 中的绑定就完成了 (后面的完整例子我将会以文字介绍该过程)

   三、关于类的实现

    这里我们将要 实现两个接口的功能 ,下面我将分开来 阐述

   

    1. IHttpAsyncHandler 接口

    需实现方法以及属性 如下 :

        IAsyncResult BeginProcessRequest( HttpContext context , AsyncCallback cb , Object extradata ) 
       启动对 HTTP 处理程序的异步调用

        参数说明 : 
                         context  : 该对象提供对用于向  HTTP  请求提供服务的内部服务器对象 (如  Request 、 Response 、 Session  和  Server ) 的引用。
                         cb  : 当异步操作完成后调用该委托告知我们操作已经完成
                         extradata  : 处理该请求所需的所有额外数据
       返回值 :
                       返回有关进程状态的 IAsyncResult   (可以让我们时刻查看异步调用中的当前状态)

      void EndProcessRequest( IAsyncResult result )
     进程结束时提供异步处理End方法


            参数说明:
                               result  : 有关进程状态的IAsyncResult (这里的result跟BeginProcessRequest返回的是同一个对象,只是内部的属性等等改变了)

    注: 但是我们还要实现不在IHttpAsyncHandler接口中的一个属性和一个方法,否则IIS会报错

     bool IsRusable
    表明是否使用池,只需要实现 get ,返回 false 表示不使用,返回 true 表示使用。

    void ProceessRequest( HttpContext context )
    同步HTTP处理程序被调用的方法( 这里并不会调用该方法,但是必须实现)



    2. IAsyncResutl 接口

    需实现方法以及属性如下:

       Object AsyncState
      获取用户定义的对象 (其实就是以上的 extradata 并且只要实现 get  )

       WaitHandler AsyncWaitHandle
      获取用于等待异步操作完成的 WaitHandle  (一般都是返回NULL 并且只要实现 get  )        bool CompletedSynchronously
      获取异步操作是否同步完成的指示 (一般都是返回false)        bool IsCompleted
      获取异步操作是否已完成的指示

  四、实现该功能 (iis7 / asp.net 4.0 / vs2010 / windows 7 64bit )

    注: 1.新建空 web 项目,并添加  App_Code  文件夹,并 部署 在  iis  上

         2.在 App_Code 中新建一个类,命名为"AsyncRequestHandler.cs" (这里的命名不影响,但是类名是关键)

         3.在 AsyncRequestHandler.cs 中 引用  " System.Threading " 命名空间

    下面我们将一步一步的学习实现这个功能,虽然只是一个很简单的例子,但是可以让你在以后的开发中更加灵活的运用。

     1. 实现  IHttpAsyncHandler  接口

    代码如下:

   

  1   public   class   AsyncHttpHandler : IHttpAsyncHandler
   2   {
   3       public   AsyncHttpHandler()
   4       {
   5           // 
  6           //  TODO: 在此处添加构造函数逻辑
   7           //
   8       }
   9  
 10       public   bool   IsReusable
  11       {
  12           get 
 13           {
  14               return   false ;  //  表明不使用池 
 15           }
  16       }
  17  
 18       public   void  ProcessRequest(HttpContext context)  //  不调用  必须实现的方法 
 19       {
  20           throw   new   InvalidOperationException();
  21       }
  22  
 23       ///   <summary> 
 24       ///   当客户申请时执行的异步处理
  25       ///   </summary> 
 26       ///   <param name="context">  包含httpresponse、httprequest、server对象  </param> 
 27       ///   <param name="cb">  回调函数  </param> 
 28       ///   <param name="extradata">  需要传递的参数  </param> 
 29       ///   <returns>  返回有关进程的状态信息  </returns> 
 30       public  IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb,  object  extradata)  //    必须实现的方法 
 31       {
  32          context.Response.Write( "  <p>AsyncHttpHandler</p>  " );  //  向页面中写入html表明是该信息来自何处 
 33          AsyncOperation op =  new  AsyncOperation(context, cb, extradata);  //  实例化实现了 IAsyncResult 接口的类(主要实现异步处理的类) 
 34          op.StartAsyncWork();  //  开始异步处理 
 35           return  op;  //  返回该对象 
 36       }
  37  
 38       ///   <summary> 
 39       ///   当BeginProcessRequest中的 return op;与异步的处理完成后调用(调用完既呈现页面)
  40       ///   </summary> 
 41       ///   <param name="result">  为op,但是属性已改变  </param> 
 42       public   void   EndProcessRequest(IAsyncResult result)
  43       {
  44       }
  45  }

   2.实现  IAsyncResult  接口 (与上面的代码在同一个文件中)

    代码如下:

  1   public   class   AsyncOperation : IAsyncResult
   2   {
   3      HttpContext _context;  //  保存context的引用 
  4      AsyncCallback _cb; //  保存回调委托的引用 
  5       object  _state; //  保存额外的信息 
  6       bool  _iscomplate; //  保存异步操作是否完成 
  7  
  8       ///   <summary> 
  9       ///   构造函数,将AsyncHttpHandler的参数全部传递进来
  10       ///   </summary> 
 11       ///   <param name="context"></param> 
 12       ///   <param name="cb"></param>   //该回调不可被重写,否则将会出现客户端永久等待的状态
  13       ///   <param name="state"></param>    //构造时该值可以传递任意自己需要的数据 
 14       public  AsyncOperation(HttpContext context, AsyncCallback cb,  object   state)
  15       {
  16          _context =  context;
  17          _cb =  cb;
  18          _state =  state;
  19          _iscomplate =  false ;  //  表明当前异步操作未完成 
 20       }
  21  
 22       ///   <summary> 
 23       ///   实现获得当前异步处理的状态
  24       ///   </summary> 
 25       bool   IAsyncResult.IsCompleted
  26       {
  27           get 
 28           {
  29               return   _iscomplate;
  30           }
  31       }
  32  
 33       ///   <summary> 
 34       ///   返回 false 即可
  35       ///   </summary> 
 36       bool   IAsyncResult.CompletedSynchronously
  37       {
  38           get 
 39           {
  40               return   false  ;
  41           }
  42       }
  43  
 44       ///   <summary> 
 45       ///   将返回额外的信息
  46       ///   </summary> 
 47       object   IAsyncResult.AsyncState
  48       {
  49           get 
 50           {
  51               return   _state;
  52           }
  53       }
  54  
 55       ///   <summary> 
 56       ///   为空
  57       ///   </summary> 
 58       WaitHandle IAsyncResult.AsyncWaitHandle
  59       {
  60           get 
 61           {
  62               return   null  ;
  63           }
  64       }
  65  
 66       ///   <summary> 
 67       ///   表明开始异步处理的主函数(方法名可以改,但上面的调用也需要一起改)
  68       ///   </summary> 
 69       public   void   StartAsyncWork()
  70       {
  71          ThreadPool.QueueUserWorkItem( new  WaitCallback(StartAsyncTask),  null ); //  相信很多玩国.net winform 开发的一定认识 
 72       }
  73  
 74       ///   <summary> 
 75       ///   异步操作调用的方法
  76       ///   </summary> 
 77       ///   <param name="workstate">  为QueueUserWorkItem方法中第二个参数传递的值  </param> 
 78       public   void  StartAsyncTask( object   workstate)
  79       {
  80          _context.Response.Write( "  <p>Completion IsThreadPoolThread is  "  + Thread.CurrentThread.IsThreadPoolThread +  "  </p>  "  );
  81          _iscomplate =  true ;  //  表明异步操作已完成 
 82          _cb( this ); //  调用回调函数表明完成 
 83       }
  84  }

  3.web.config 配置

内容如下( 红色方框部分为需要添加的内容):

  4.iis绑定 (如何绑定见 二 )

5.测试

  时你随意的写   test.async  或者   asd.async  等等,最后呈现的页面都是一致的。这样就达到我们的效果了

 五、看完这些只是浅层

    这里我想指明的是看完这些并不代表你已经掌握了所有,因为关于异步还有一个部分就是共享资源的使用,这个就需要使用到 WaitHandle 类,否则就会导致多个线程同时访问并修改同一个共享资源,后果可想而知。所以在这篇文章完结的同时也意味着新的问题的开始,所以我们要不断的学习下去。

在满足必要的经济的条件下,研究更佳高深的技术.满足自己的野心

 

分类:  ASP.NET

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于ASP.NET 之 自定义 异步HTTP处理程序的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did47323

更新时间:2022-09-24   阅读:45次

上一篇: 性能测试中“并发度”的意义

下一篇:enyo学习之enyo的框架结构

相关资讯

最新资料更新

  • 1.从历代GC算法角度刨析ZGC
  • 2.算法学习笔记(9): 中国剩余定理(CRT)以及其扩展(EXCRT)
  • 3.多层前馈神经网络及BP算法
  • 4.JS中数组随机排序实现方法(原地算法sort/shuffle算法)
  • 5.详解C/C++高精度(加减乘除)算法中的压位优化
  • 6.希望所有计算机专业同学看到这篇大一规划
  • 7.C++算法之旅、05 基础篇 | 第二章 数据结构
  • 8.算法总结--ST表
  • 9.子数组的最大异或和问题
  • 10.数据结构之KMP算法next数组
  • 11.文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题
  • 12.分布式协议与算法-Quorum NWR
  • 13.数组中未出现的最小正整数(算法)
  • 14.《算法导论》笔记 第8章 8.1排序算法时间的下界
  • 15.matlab-图像处理-边缘检测算法五种
  • 16.C++ 算法竞赛、02 周赛篇 | AcWing 第2场周赛
  • 17.简述几种常用的排序算法
  • 18.Python排序算法之冒泡排序
  • 19.Java搜索与图论之DFS和BFS算法详解
  • 20.面试官:限流算法有哪些?

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]