实践:创建异步 HTTP 处理器

异步 HTTP 处理器允许你启动外部进程(比如一个调用远程服务器的方法),并且在无需等待外部进程被完成的情况之下继续处理器自身的处理。另外,在处理一个异步 HTTP 处理器的期间,ASP.NET 还会把通常用于外部进程的线程返回到线程池中,直到处理器从外部进程中接收到一个回调为止。这样能够防止线程阻塞并且能够改进性能,因为在同一时间内只有为数不多的线程才能够被执行。如果有许多用户请求了依赖于外部进程的同步 HTTP 处理器,那么操作系统就能够脱离线程而得到高速运行,因为许多线程都已经被阻塞并且需要等待外部进程的结束。

下列代码示范了一个在 ASP.NET 应用程序中对扩展名是 .SampleAsync 的文件的请求进行处理的异步 HTTP 处理器。这个范例说明了这个处理器的代码,然后说明了如何把扩展名 .SampleAsync 映射到 ASP.NET 中的处理器。最后,这个范例还说明了如何在 IIS 中把扩展名 .SampleAsync 映射到 ASP.NET,因此 IIS 会把以 .SampleAsync 为结尾的请求转送给 ASP.NET。

关于 ASP.NET 运行时如何与 IIS 相互作用的更多信息,请参考:[ASP.NET 应用程序生命周期概览]。

创建名为 HelloWorldAsyncHandler 的 HTTP 处理器类

  • 在你的 App_Code 目录中创建名为 HelloWorldAsyncHandler 的类并且添加下列代码到这个类文件中:
    using System;
    using System.Web;
    using System.Threading;class HelloWorldAsyncHandler : IHttpAsyncHandler
    {public bool IsReusable { get { return false; } }public HelloWorldAsyncHandler(){}public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData){context.Response.Write("<p>Begin IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");AsynchOperation asynch = new AsynchOperation(cb, context, extraData);asynch.StartAsyncWork();return asynch;}public void EndProcessRequest(IAsyncResult result){}public void ProcessRequest(HttpContext context){throw new InvalidOperationException();}
    }class AsynchOperation : IAsyncResult
    {private bool _completed;private Object _state;private AsyncCallback _callback;private HttpContext _context;bool IAsyncResult.IsCompleted { get { return _completed; } }WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }Object IAsyncResult.AsyncState { get { return _state; } }bool IAsyncResult.CompletedSynchronously { get { return false; } }public AsynchOperation(AsyncCallback callback, HttpContext context, Object state){_callback = callback;_context = context;_state = state;_completed = false;}public void StartAsyncWork(){ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);}private void StartAsyncTask(Object workItemState){_context.Response.Write("<p>Completion IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");_context.Response.Write("Hello World from Async Handler!");_completed = true;_callback(this);}
    }

    代码中实现了 BeginProcessRequest 方法。这个方法把一个字符串写入到了当前 HttpContext 对象的 Response 属性中,并且创建了 AsyncOperation 类的一个新实例,还调用了 StartAsyncWork 方法。然后 StartAsyncWork 方法会把 StartAsyncTask 代理添加到 ThreadPool 对象中。当线程开始生效的时候,StartAsyncTask 方法就会被调用,并且会输出另外一个字符串到 Response 属性中,然后通过调用 AsyncCallback 代理来完成其他任务。

注册自定义 HTTP 处理器

一旦你的自定义 HTTP 处理器类被创建,你就必须把它注册到 Web.config 文件中,这样 ASP.NET 才能够为扩展名是 .SampleAsync 的文件请求提供服务。

在 Web.config 文件中注册自定义 HTTP 处理器
  1. 如果你的 Web 站点中没有 Web.config 文件,就可以创建一个。
  2. 添加下列代码到你的 Web.config 文件中:
    <configuration><system.web><httpHandlers><add verb="*" path="*.SampleAsync" type="HelloWorldAsyncHandler"/></httpHandlers></system.web>
    </configuration>

    以上代码把 HelloWorldAsyncHandler 处理器注册成了对以 .SampleAsync 作为结尾的请求而提供服务的处理器。

在 IIS 中配置 HTTP 处理器扩展

IIS 只把特定文件类型的请求传递给 ASP.NET 的服务。默认时,扩展名是 .aspx、.ascx,.asmx 的文件都已经被映射到了 ASP.NET。但是,如果你需要 ASP.NET 处理自定义的文件扩展名,那么你就必须在 IIS 中进行注册。关于更多信息,请参考:[ASP.NET 应用程序生命周期概览]。

在 IIS 中映射扩展名
  1. 打开 Internet Services Manager。
  2. 右击你的应用程序并且选择 Properties。
  3. 在 Directory 标签中,点击 Configuration。
  4. 选择 Mappings 标签。
  5. 添加一个新关联把 .SampleAsync 映射到适当的 Aspnet_isapi.dll 版本。
  6. 如果你需要你的处理器在运行的时候不需要检测用户请求的文件是否已经存在,那么就可以清除 Check if the file exist 复选框。

测试自定义 HTTP 处理器

一旦你已经创建并且已经注册你的自定义 HTTP 处理器,那么你就可以通过从应用程序中发送一个扩展名是 .SampleAsync 的请求来对它进行测试。

测试你的自定义 HTTP 处理器
  • 浏览到你的应用程序并且在浏览器中输入一个以 .SampleAsync 作为结尾的 URL。

转载于:https://www.cnblogs.com/Laeb/archive/2007/03/15/675711.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nyoj187 快速查找素数

快速查找素数 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;3描述现在给你一个正整数N&#xff0c;要你快速的找出在2.....N这些数里面所有的素数。 输入给出一个正整数数N(N<2000000)但N为0时结束程序。测试数据不超过100组输出将2~N范围…

深度:关于Linux内核最硬核的文章

来源 &#xff1a;头条号Linux学习教程&#xff0c;冰凌块儿01前言本文主要讲解什么是Linux内核&#xff0c;以及通过多张图片展示Linux内核的作用与功能&#xff0c;以便于读者能快速理解什么是Linux内核&#xff0c;能看懂Linux内核。拥有超过1300万行的代码&#xff0c;Linu…

springaop----springaop的使用(一)

与大多数技术一样&#xff0c; AOP 已经形成了自己的术语。描述切面的常用术语有通知&#xff08;advice&#xff09;、切点&#xff08;pointcut&#xff09;和连接点&#xff08;join point&#xff09;。从今天开始&#xff0c;我们对spring的切面编程做一个总结。她们都是你…

Microsoft .NET Pet Shop 4 架构与技术分析

1&#xff0e;项目概述与架构分析微软刚推出了基于ASP.NET 2.0下的Pet Shop 4, 该版本有了一个全新的用户界面。是研究ASP.NET 2.0的好范例啊&#xff0c;大家都知道&#xff0c;一直以来&#xff0c;在.NET和Java之间争论不休&#xff0c;到底使用哪个平台开发的企业级应用性能…

nyoj 14 会场安排问题

会场安排问题 时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述学校的小礼堂每天都会有许多活动&#xff0c;有时间这些活动的计划时间会发生冲突&#xff0c;需要选择出一些活动进行举办。小刘的工作就是安排学校小礼堂的活动&#xff0c;…

想领取开发套件,就来参加AIoT开发者大赛

你心目中的智慧校园长什么样&#xff1f; 传统校园上自习得排队等位&#xff0c;智慧校园手机一键查询空位&#xff0c;抢座占位有序便利&#xff1b; 传统校园灯光全靠手动调整&#xff0c;智慧校园灯光无感调控&#xff0c;营造全新智能光照环境&#xff1b;传统校园安全防护…

Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]

对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力&#xff0c;但是由于 PHP 本身的局限&#xff0c;以及考虑到开发环境配置的复杂程度&#xff0c;最终使用了折中方案。接下来&#xff0c;我们谈谈整个技术选型历程&#xff0c;也供今后相关开发者做借鉴和参…

SQL Server 数据库构架

Microsoft SQL Server™ 2000 数据存储在数据库中。在数据库中&#xff0c;数据被组织到用户可以看见的逻辑组件中。数据库还可以按物理方式&#xff0c;在磁盘上作为两个或更多的文件实现。使用数据库时使用的主要是逻辑组件&#xff0c;例如表、视图、过程和用户。文件的物理…

[教程]win10 ,ubuntu双系统安装避坑指南

这篇博客可以解决1.如何安装win10,ubuntu双系统2.如何使用win10引导Ubuntu&#xff0c;并且设置win10引导界面点击阅读原文获取更多信息。win10,ubuntu双系统的安装为什么要装双系统&#xff0c;之前用的虚拟机&#xff0c;但是虚拟机没有显卡&#xff0c;使用gazebo之类的3D仿…

nyoj 586 疯牛(二分+贪心)

疯牛 时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;4描述农夫 John 建造了一座很长的畜栏&#xff0c;它包括N (2 < N < 100,000)个隔间&#xff0c;这些小隔间依次编号为x1,...,xN (0 < xi < 1,000,000,000).但是&#xff0c;Jo…

es6--解构赋值

1&#xff1a; 基本用法 let [a,b,c] [1,2,3] 总结&#xff1a;只要等号两边都是可循环的结构&#xff0c;等号右边的就会按照相应的位置把值赋给左边 2&#xff1a;高级用法 let [x,y 1] [1,2] 1) 变量可以有默认值 let [x,y 1] [1,2] 2&#xff09;当且仅当等号右边的…

Type-C PD充电简介

一、Type-C简介自1998年以来&#xff0c;USB发布至今&#xff0c;USB已经走过20个年头有余了。在这20年间&#xff0c;USB-IF组织发布N种接口状态&#xff0c;包括A口、B口、MINI-A、MINI-B、Micro-A、Micro-B等等接口形态&#xff0c;由于各家产品不同&#xff0c;不同产品使用…

Linux字符设备驱动内幕

哈喽&#xff0c;我是老吴&#xff0c;继续记录我的学习心得。一、保持专注的几个技巧将最重要的事放在早上做。待在无干扰环境下&#xff0c;比如图书馆。意识到刚坐下开始投入工作前&#xff0c;有点负面小情绪是特别正常的现象。让“开心一刻”成为计划的一部分。拥有合情合…

线性表的顺序存储

线性表是n个类型相同数据元素的有限序列&#xff0c;对n>0,除第一个元素无直接前驱&#xff0c;最后一个元素没有直接后继外&#xff0c;其他都是每个元素有一个直接前驱和直接后继&#xff0c;而且是一对一的关系。 线性表&#xff1a;顺序存储&#xff0c;链式存储。 &…

mysql 5.6.38 数据库编译安装

一、系统环境&#xff1a; # cat /etc/redhat-release CentOS release 6.9 (Final)二、mysql 编译安装&#xff1a; 1、安装依赖包&#xff1a; yum install -y ncurses-devel libaio-devel cmake2、创建mysql管理用户&#xff1a; useradd -s /sbin/nologin -M mysql id m…

旧地重游

光阴飞逝1991年跟随父母搬迁至长沙&#xff0c;至今已有16年。2007年春节舅妈大寿借此机会回到儿时旧地以了多年来的心愿。经过1个小时左右颠簸终于快回到儿时生长的地方&#xff0c;那里的路面年久失修&#xff0c;经过昨天的大雨&#xff0c;已经坑坑洼洼路面到处积水&#x…

我要不要离职?

1#读者提问来到四线城市的小公司&#xff0c;其他员工都是公司主动找到他们转正的&#xff0c;有的一个月有的三个月&#xff0c;而我半年过去了&#xff0c;以为时间到了也跟他们一样自动帮我转正。然而没有&#xff0c;昨天忍不住问了公司&#xff0c;今天就拿转正表来给我填…

单链表的应用 就地逆置

【问题描述】试实现线性表的就地逆置算法&#xff0c;即在原表的存储空间将线性表&#xff08;a1,a2,a3....an&#xff09;逆置为&#xff08;an...a3,a2,a1&#xff09;. [分析]就地逆置就是不需要额外申请结点空间&#xff0c;只需要利用原来的表中的结点空间。若对顺序表中的…

关于arguments的用法

当函数的参数个数无法确定的时候&#xff1a;用 arguments。函数的 arguments 对象并不是一个数组&#xff0c;它相当于是一个实参的集合&#xff0c;但是访问单个参数的方式与访问数组元素的方式相同。访问 函数中的第n个参数 则可以使用arguments[n-1]。 1、arguments实际为实…

搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?

守护进程概念&#xff1a;守护进程&#xff0c;也就是通常所说的Daemon进程&#xff0c;是Linux中的后台服务进程。周期性的执行某种任务或等待处理某些发生的事件。Linux系统有很多守护进程&#xff0c;大多数服务都是用守护进程实现的。比如&#xff1a;像我们的tftp&#xf…