1.前言1。对于读者想说的:(可以跳过),我要感谢看过这篇文章《ASP.NET之自定义同步HTTP处理程序》的人和看过这篇文章《ASP.NET 之 自定义 异步HTTP处理程序》的人。那些可能在上一篇文章中读过MSDN的人会发现许多熟悉的地方。其实我只是详细介绍了一下,让大家更好的理解PS: MSDN从头到尾写的,字很统一。我怕很多人觉得害怕,懒得看,所以我把它的重要部分提炼出来,用通俗易懂的例子和简洁的语言来描述。当然,错误是不可避免的。希望你能指出来。2.在正式开始之前,我们了解了自定义同步HTTP处理程序,相信大家可能都觉得自己有所成就(大牛们可能觉得这么轻松)。但这种同步机制只能应对客户访问量少或数据处理量不大的情况(每次应用同步HTTP处理程序都会创建一个新的线程进行处理,应用量大时会阻塞线程,导致服务器性能低下甚至宕机)。今天的文章就是要解决同步HTTP处理程序的致命缺点,有效利用服务器的资源。PS:异步(只在本文的情况下):简单来说就是有些操作是使用我们自己创建的线程,其他操作由操作系统调用的线程有序处理,这样我们就可以自己的线程完成简单的处理,而复杂的处理则交给系统管理的线程。因为这些线程是由系统管理的,所以不会卡住,会在系统内部自动管理。当然,系统会通过通知的方式通知自己的线程处理已经完成,这样就可以避免多线程技术难以管理的问题。以下是图例: 。
二、注册和绑定(虽然前面的文章已经介绍过了,但这里还是再讲一遍)为什么要有这两个?还要注册和绑定这两个?答案是你不可能通过只写一个类vs就知道自己在做什么,所以我们需要在web.config中注册我们的自定义HTTP处理程序Binding就是让iis知道我们的网站包含一个自定义HTTP处理程序。(我会以iis7为例说明如何绑定。) 1.注册和复制代码如下:配置系统。Web HttpHandlers添加动词=' * '路径='!-在此处写入要绑定的客户端应用程序的页面(*。SMM *。FFS,网络1 . FFE)——“类型=”!-在此处写入处理程序的类名-'/httphandlers/system。web/配置。以上部分我都是自己写的,有评论。2.bind (iis7 )1)打开iis7->打开网站节点->点击你的网站名称。2)双击。
3)点击4) 。
5)最后,点击OK,在iis中完成绑定(对于下面完整的例子,我将用文字介绍这个过程)。3.关于类的实现,这里我们将实现两个接口的功能。下面我会单独解释。1.IHTTPASYNCHANDLER接口的方法和属性如下: iasyncresult BeginProcessRequest(HTTPContext Context,AsyncCallbackCB,Object extradata)启动对HTTP处理程序的异步调用。参数描述:上下文:该对象提供了对用于向HTTP请求提供服务的内部服务器对象(如请求、响应、会话和服务器)的引用。Cb :当异步操作完成时,调用这个委托通知我们操作已经完成。extradata :返回处理请求所需的所有额外数据。返回关于进程状态的IAsyncResult(它可以让我们在异步调用中始终检查当前状态)。void EndProcessRequest(iasyncresultr)。在流程结束时提供异步处理。结束方法参数描述:结果:关于进程状态的IAsyncresult(此处的结果返回与BeginProcessRequest相同的对象,只有内部属性等发生了变化。)注意:但是,我们需要实现一个不在IHttpAsyncHandler接口中的属性和方法,否则IIS会报告错误。bool IsRusable表示是否使用池,只需要实现get,返回false表示不使用,返回true表示使用。void proceessrequest(HTTPcontextcontext)同步http处理程序的被调用方法(这里不调用这个方法,但是必须实现)2。iasyncreutl接口需要实现的方法和属性如下: Object AsyncState获取用户定义的对象(其实就是上面的extradata,只需要实现get )WaitHandler AsyncWaitHandle获取WaitHandle,用于等待异步操作完成。(一般返回NULL,只实现get)同步完成的bool获取异步操作是否同步完成的指示(一般返回false)。bool完成获取异步操作是否完成的指示。4.实现此功能(iis7/asp.net 4.0/vs2010/。windows 7 64位)注意: 1。创建一个空的web项目,添加一个App_Code文件夹,并将其部署在iis 2上。在App_Code中创建新类,并将其命名为‘asyncrequesthandler . cs’(这里的命名不影响,但是,类名是关键。) 3.参考“系统”。我们将逐步学习和实现这个函数。虽然只是一个简单的例子,但是可以让你在以后的开发中更灵活的使用。
1.实现IHttpAsyncHandler接口代码如下:复制代码代码如下:公共类异步调用程序: IHttpAsyncHandler {公共异步调用程序(){ ////TODO:在此处添加构造函数逻辑//} public bool IsReuse { get { return false;//表明不使用池} }公共void进程请求(HttpContext上下文)//不调用必须实现的方法{抛出新的invalid operationexception();} ///摘要///当客户申请时执行的异步处理////summary///param name=' context '包含httpresponse、httprequest、服务器对象/param ///param名称='cb '回调函数/param ///param name='extradata '需要传递的参数/param /返回返回有关进程的状态信息/返回公共IAsyncResult BeginProcessRequest(HttpContext上下文,AsyncCallback cb,object extradata) //必须实现的方法{上下文。响应。写入(“pasynchtphandler/p”);//向页面中写入超文本标记语言表明是该信息来自何处异步操作op=新的异步操作(上下文、cb、引渡数据);//实例化实现了IAsyncResult接口的类(主要实现异步处理的类)op . StartAsyncWork();//开始异步处理返回操作;//返回该对象} ///摘要///当BeginProcessRequest中的返回操作;与异步的处理完成后调用(调用完既呈现页面)////summary///param name=' result '为op,但是属性已改变/param public void EndProcessRequest(IAsyncResult结果){ } }2。实现IAsyncResult接口(与上面的代码在同一个文件中)代码如下:复制代码代码如下:公共类异步操作: IAsyncResult { HttpContext _ context;//保存语境的引用AsyncCallback _ cb//保存回调委托的引用对象状态;//保存额外的信息bool _ is complete//保存异步操作是否完成///摘要///构造函数,将异步调用程序的参数全部传递进来////summary///param name=' context '/param///param name=' CB '/param//该回调不可被重写,否则将会出现客户端永久等待的状态///param name='state'/param //构造时该值可以传递任意自己需要的数据公共AsyncOperation(HttpContext上下文,AsyncCallback cb,对象状态){ _ context=context _ CB=CB _ state=state _ is complete=false//表明当前异步操作未完成} ///摘要///实现获得当前异步处理的状态////摘要bool IAsyncResult .已完成{ get { return _ is complete} } ///摘要///返回错误的即可////摘要bool IAsyncResult .已完成同步{ get { return false} } ///摘要///将返回额外的信息////汇总对象IAsyncResult .async state { get { return _ state } }///摘要///为空////摘要WaitHandle IAsyncResult .asyncWaitHandle { get { return null;} } ///摘要///表明开始异步处理的主函数(方法名可以改,但上面的调用也需要一起改)////summary public void StartAsyncWork(){线程池.QueueUserWorkItem(新的WaitCallback(StartAsyncTask),null);//相信很多玩国net winform .开发的一定认识} ///摘要///异步操作调用的方法////summary///param name=' workstate '为QueueUserWorkItem方法中第二个参数传递的值/param public void StartAsyncTask(对象工作状态){ _context .响应。写入(“pCompletion IsThreadPoolThread为螺纹.CurrentThread。是readpoolthread '/p ');_ is complete=true//表明异步操作已完成_cb(此);//调用回调函数表明完成} }3.web.config配置内容如下(红色方框部分为需要添加的内容:
4.iis绑定(如何绑定请参见2)(9504 . 163.com)。
5.在测试过程中,您可以随意编写test.async或asd.async,最后的页面都是一致的。5.看完这些,只是表面文章。这里我想指出的是,看完这些,并不代表你什么都掌握了,因为关于异步还有另外一部分,就是共享资源的使用,所以我们需要使用WaitHandle类,否则会导致多个线程同时访问和修改同一个共享资源,后果可想而知。所以,这篇文章的结尾也意味着新问题的开始,所以要不断学习。