AsyncWebServiceHandler
L’immagine mostra le differenze tra una pagina Asp.Net Sincrona e Asincrona;
Per modificare il comportamento di un Webservice .Net in modo simile ad una pagina Asp.Net asincrona (quelle con <%@ Page Async=”true” … %> ) è sufficente modificare l’HttpHandler dell’applicazione web come segue:
Aprire il  Web.config e nel tag <httpHandlers> di <system.web> commentare l’attuale Handler come segue:
1 2 |
<!-- <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> --> |
A questo punto aggiungere il nuovo handler la cui dll dovrà essere presente nella vostra /bin
1 |
<add verb="*" path="*.asmx" type="AsyncWebServiceHandler.AsyncWebServiceHandler, AsyncWebServiceHandler" /> |
Operazione conclusa.
Sorgenti della DLL (AsyncWebServiceHandler.cs)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
namespace AsyncWebServiceHandler {yncWebServiceHandler.AsyncWebServiceHandler, AsyncWebServiceHandler" /> using System; using System.Web; using System.Web.SessionState; using System.Web.Services.Protocols; public class AsyncWebServiceHandler : System.Web.UI.Page, IHttpAsyncHandler, IRequiresSessionState { protected override void OnInit(EventArgs e) { AsyncMode=true; IHttpHandler handler = new WebServiceHandlerFactory ().GetHandler( this.Context, this.Context.Request.HttpMethod, this.Context.Request.FilePath, this.Context.Request.PhysicalPath); handler.ProcessRequest(this.Context); this.Context.ApplicationInstance.CompleteRequest(); } public IAsyncResult BeginProcessRequest( HttpContext context, AsyncCallback cb, object extraData) { return this.AsyncPageBeginProcessRequest( context, cb, extraData); } public void EndProcessRequest(IAsyncResult result) { this.AsyncPageEndProcessRequest(result); } } } |