Maison >développement back-end >Tutoriel C#.Net >Explication détaillée du code de la demande d'écoute asynchrone C# HttpHandler

Explication détaillée du code de la demande d'écoute asynchrone C# HttpHandler

黄舟
黄舟original
2017-03-03 11:28:412059parcourir

Dans la programmation côté serveur sous haute concurrence, lorsque vous rencontrez des goulots d'étranglement de performances, ils sont souvent causés par la synchronisation. Lors de l'écoute des requêtes HTTP, l'asynchrone est nécessaire.

Classe de base pour écouter de manière asynchrone les requêtes 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; }
        }
    }
}

Ajoutez 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
            }


        }
    }
}

Introduisez MyHandler.dll dans le site et modifiez WebConfig comme suit :

<?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>

Ce qui précède est l'explication détaillée du code de la demande d'écoute asynchrone C# HttpHandler Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !




Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn