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