旗下导航:搜·么
当前位置:网站首页 > .Net教程 > 正文

C# HttpHandler 异步监听要求的代码详解【C#.Net教程】,C# ,HttpHandler ,异步监听

作者:搜教程发布时间:2019-11-27分类:.Net教程浏览:36评论:0


导读:在高并发下的服务器端编程,当碰到机能瓶颈时刻,往往是同步带来的。监听HTTP要求的时刻,异步是必需的。异步监听HTTP要求的基类:usingSystem;usin...
在高并发下的服务器端编程,当碰到机能瓶颈时刻,往往是同步带来的。监听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>

以上就是C# HttpHandler 异步监听要求的代码详解的内容,更多相关内容请关注ki4网(www.ki4.cn)!

标签:C#HttpHandler异步监听


欢迎 发表评论: