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:
<!-- <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
<add verb="*" path="*.asmx" type="AsyncWebServiceHandler.AsyncWebServiceHandler, AsyncWebServiceHandler" />
Operazione conclusa.
Sorgenti della DLL (AsyncWebServiceHandler.cs)
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);
}
}
}