Ho un'azione MVC di lunga durata (4-10 secondi) che esegue un report da una chiamata AJAX. Mentre è in esecuzione, gli utenti possono modificare i parametri ed eseguire qualcos'altro, quindi annullo la richiesta AJAX prima di crearne un'altra.Come si annulla un lato client di azione MVC AJAX long running (in javascript)?
Così, per esempio (ad esempio in jQuery, ma il problema si verifica a prescindere):
// If we have an active request and it's not complete
if(dataRequest && dataRequest.readyState != 'complete')
{
dataRequest.abort();
}
dataRequest = $.ajax(...);
lato client questo sembra funzionare bene, ma la richiesta cancellato è ancora in esecuzione sul server. Ad esempio se il report impiega 10 secondi, e ne annullo uno e avvio l'altro, la seconda richiesta impiega 20 secondi.
penso che questo sia dovuto al session level locking:
[Se] due richieste simultanee sono fatti per la stessa sessione (utilizzando lo stesso valore di SessionID), la prima richiesta ottiene l'accesso esclusivo al il informazioni sulla sessione. La seconda richiesta viene eseguita solo dopo che è stata completata la prima richiesta .
Quindi la seconda richiesta non può accedere alla sessione fino al termine del primo. L'utilizzo di azioni MVC asincrone non sembra aggirarlo poiché l'azione deve ancora essere in grado di apportare modifiche alla sessione.
È possibile interrompere un'azione e avviare la successiva senza utilizzare AsyncController
o [SessionState(SessionStateBehavior.ReadOnly)]
?
Se non è necessario?
Fai attenzione a "IsClientConnected' perché può sembrare un serio problema di prestazioni per controllarlo, vedi http://stackoverflow.com/questions/9094735/when-is-response-isclientconnected-slow – Keith
Ciao Keith! Ho un problema simile ma non ho potuto risolverlo nemmeno con la tua risposta, (http://stackoverflow.com/questions/29235850/how-to-abort-long-running-ajax-request-in-net-mvc-4) C'è un modo per aiutarmi? Oppure potresti pubblicare un tuo codice di esempio per attivare 'this.Response.IsClientConnected' –