当前位置: 首页 > news >正文

HttpHandler 异步监听请求

在高并发下的服务器端编程,当遇到性能瓶颈时候,往往是同步带来的。监听HTTP请求的时候,异步是必须的。


异步监听HTTP请求的基类:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Web;


namespace MyHandler
{
    public abstract class HttpAsyncHandler : IHttpAsyncHandler, IAsyncResult
    {
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
        {
            _callback = cb;
            _context = context;
            _completed = false;
            _state = this;


            ThreadPool.QueueUserWorkItem(new WaitCallback(DoProcess), this);
            return this;
        }


        public void EndProcessRequest(IAsyncResult result)
        {


        }


        public bool IsReusable
        {
            get { return false; }
        }


        public abstract void BeginProcess(HttpContext context);


        public void EndProcess()
        {
            //防止多次进行多次EndProcess


            if (!_completed)
            {
                try
                {
                    _completed = true;
                    if (_callback != null)
                    {
                        _callback(this);
                    }
                }
                catch (Exception) { }
            }
        }


        private static void DoProcess(object state)
        {
            HttpAsyncHandler handler = (HttpAsyncHandler)state;
            handler.BeginProcess(handler._context);
        }


        public void ProcessRequest(HttpContext context)
        {
            throw new NotImplementedException();
        }


        private bool _completed;
        private Object _state;
        private AsyncCallback _callback;
        private HttpContext _context;


        public object AsyncState
        {
            get { return _state; }
        }


        public WaitHandle AsyncWaitHandle
        {
            get { throw new NotImplementedException(); }
        }


        public bool CompletedSynchronously
        {
            get { return false; }
        }


        public bool IsCompleted
        {
            get { return _completed; }
        }
    }
}


添加TestHandler.cs:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace MyHandler
{
    public class TestHandler : HttpAsyncHandler
    {
        public override void BeginProcess(System.Web.HttpContext context)
        {
            try
            {
                StreamReader sr = new StreamReader(context.Request.InputStream);


                string reqStr = sr.ReadToEnd();
                context.Response.Write("get your input : " + reqStr + " at " + DateTime.Now.ToString());
            }
            catch (Exception ex)
            {
                context.Response.Write("exception eccurs ex info : " + ex.Message);
            }
            finally
            {
                EndProcess();最后别忘了end
            }


        }
    }
}




在站点引入MyHandler.dll,并按照如下修改 WebConfig:


<?xml version="1.0" encoding="utf-8"?>


<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
    <httpRuntime requestValidationMode="2.0"/>
    <customErrors mode="Off"/>
    <httpHandlers>
      <add verb="*" path="Test.aspx" type="MyHandler.TestHandler, MyHandler"/>
    </httpHandlers>
  </system.web>


</configuration>




相关文章:

  • 互联网进军影视作品的软广告
  • JS 动态增加DIV 的大小
  • 在UltraWebGrid中验证填入数据
  • HTML5 拖拽图片到网页内
  • HTML5批量拖拽图片到网页
  • [创业] 美国硅谷风险投资行业的详细报告(2008年第四季度)
  • C# 异步调用代理类
  • C#事件和委托的基础知识模型
  • 异步发送HTTP请求
  • Flex开发流程设计器的经验之谈(2)
  • html5 涂鸦板
  • [IE编程] IE中使网页元素进入编辑模式
  • linux命令练习 笔记
  • [IE技巧] IE 中打开Office文件的设置
  • 配置系统未能初始化 错误的解决方案
  • .pyc 想到的一些问题
  • CSS 三角实现
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java Agent 学习笔记
  • js递归,无限分级树形折叠菜单
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Mysql优化
  • Netty 4.1 源代码学习:线程模型
  • October CMS - 快速入门 9 Images And Galleries
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python3爬取英雄联盟英雄皮肤大图
  • supervisor 永不挂掉的进程 安装以及使用
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 技术:超级实用的电脑小技巧
  • 力扣(LeetCode)965
  • 码农张的Bug人生 - 初来乍到
  • 如何学习JavaEE,项目又该如何做?
  • 问题之ssh中Host key verification failed的解决
  • 物联网链路协议
  • 栈实现走出迷宫(C++)
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​ArcGIS Pro 如何批量删除字段
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (C语言)字符分类函数
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (阿里云万网)-域名注册购买实名流程
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (接口封装)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net core 连接数据库,通过数据库生成Modell