2011-02-10 14 views
8

In un controller asincrono in ASP.NET MVC, esiste un modo per indicare se/quando la richiesta viene interrotta dal client?Rileva una richiesta interrotta in ASP.NET MVC

[NoAsyncTimeout] 
public void IndexAsync() { 
    var source = new CancellationTokenSource(); 

    Task.Factory.StartNew(() => { 
    while (true) { 
     if (source.Token.IsCancellationRequested) { 
     AsyncManager.Finish(); 
     return; 
     } 

     Response.Write("."); 
     Thread.Sleep(1000); 
    } 
    }, source.Token); 

    // Is there any way to do this? 
    Request.Aborted += (sender, e) => source.Cancel(); 

    AsyncManager.OutstandingOperations.Increment(); 
} 
+1

possibile duplicato di [Rilevamento asincrona cliente disconnessione in ASP.NET MVC] (http://stackoverflow.com/questions/4772597/detecting-async-client-disconnect-in-asp- net-mvc) Ho appena trovato anche questo, risponde alla tua domanda anche con alcune altre informazioni. –

risposta

8

Cosa succede ad usare

HttpContext.Current.Response.IsClientConnected 

Da un test molto semplice questo non sembra funzionare per le richieste Ajax abortiti. MSDN suggerisce che dovrebbe comunque.

+0

Lo sto utilizzando nei contesti di sincronizzazione all'interno di cicli while e funziona perfettamente, consentendo di disporre di processi, flussi o file memorizzati nella cache prima di terminare una risposta. –

+0

Trovo che funzioni per richieste AJAX abortite, ma non quando Fiddler sta monitorando cosa sta succedendo! Uso Fiddler quasi tutto il tempo, quindi ci è voluto un po 'per capirlo. Sto usando jQuery. Dico 'var myRequest = $ .post (...);', seguito poco dopo da 'myRequest.abort();' – teedyay

2

Prova

CancellationToken clientDisconnectedToken = HttpContext.Response.ClientDisconnectedToken; 
Problemi correlati