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

黄舟
Libérer: 2017-03-03 11:28:41
original
2029 Les gens l'ont consulté

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; }
        }
    }
}
Copier après la connexion

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
            }


        }
    }
}
Copier après la connexion

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>
Copier après la connexion

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) !




Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal