2012-01-03 8 views
6

Ho bisogno di elaborare richieste a lungo termine all'interno di IIS, la gestione della richiesta è molto leggera ma richiede molto tempo principalmente a causa di IO. Fondamentalmente ho bisogno di interrogare un altro server, che a volte interroga un terzo server. Quindi voglio elaborare più richieste che posso contemporaneamente. Per questo ho bisogno di elaborare le richieste in modo asincrono come faccio a farlo correttamente?Come elaborare le richieste di lunga durata con un gestore HTTP in IIS?

Uso della classe Socket ho potuto facilmente scrivere qualcosa di simile:

// ..listening code 
// ..Accepting code 

void CalledOnRecive(Request request) 
{ 
    //process the request a little 
    Context context = new Context() 
    context.Socket = request.Socket; 
    remoteServer.Begin_LongRunningDemonicMethod(request.someParameter, DoneCallBack, context); 
} 

void DoneCallBack() 
{ 
    IAsyncresult result = remoteServer.Begin_CallSomeVeryLongRunningDemonicMethod(request.someParameter, DoneCallBack, context); 

    Socket socket = result.Context.Socket; 
    socket.Send(result.Result); 
} 

Nell'esempio qui sopra il filo viene rilasciato non appena chiamo il metodo "Begin ...", e la risposta viene inviato su un altro thread, quindi è possibile ottenere facilmente una concorrenza molto alta. Come si fa lo stesso in un gestore HTTP all'interno di IIS?

risposta

3

È possibile implementare un HttpHandler con IHttpAsyncHandler. MSDN ha una buona panoramica con esempi su come farlo here.

+0

http://msdn.microsoft.com/en-us/magazine/cc164128.aspx –

+0

http://msdn.microsoft.com/en-us/library/bb398986.aspx aiuta troppo –

3

Inizia con qualcosa di simile:

public class Handler : IHttpAsyncHandler { 
    public void ProcessRequest(HttpContext context) 
    { 
    } 

    public IAsyncResult BeginProcessRequest(HttpContext context, 
      AsyncCallback cb, object extraData) 
    { 
     IAsyncResult ar = BeginYourLongAsyncProcessHere(cb); 
     return ar; 
    } 

    public void EndProcessRequest(IAsyncResult ar) 
    { 
     Object result = EndYourLongAsyncProcessHere(ar); 
    } 

    public bool IsReusable { get { return false; } } 
} 

Se è necessario catena richieste multiple insieme, è possibile farlo in un asincrona HttpHandler, ma è più facile se si utilizza un asincrona Page.

Problemi correlati