Tengo una acción MVC de larga duración (4-10 segundos) que ejecuta un informe de una llamada AJAX. Mientras se ejecuta, los usuarios pueden cambiar los parámetros y ejecutar otra cosa, por lo que cancelo la solicitud de AJAX antes de hacer otra.¿Cómo se cancela un lado del cliente de acción MVC de larga ejecución de AJAX (en javascript)?
Así, por ejemplo (ejemplo de jQuery, pero el problema ocurre independientemente):
// If we have an active request and it's not complete
if(dataRequest && dataRequest.readyState != 'complete')
{
dataRequest.abort();
}
dataRequest = $.ajax(...);
lado del cliente esto parece funcionar bien, pero la petición cancelada aún se está ejecutando en el servidor. Por ejemplo, si el informe demora 10 segundos, y cancelo uno y comienzo el otro, la segunda solicitud demora 20 segundos.
creo que esto es debido a la session level locking:
[Si] dos solicitudes simultáneas se realizan para la misma sesión (utilizando el mismo valor SessionID), la primera solicitud obtiene acceso exclusivo a la información de la sesión. La segunda solicitud se ejecuta solo después de que finaliza la primera solicitud .
Por lo que la segunda solicitud no puede acceder a la sesión hasta que termine la primera. El uso de acciones MVC asíncronas no parece evitar esto, ya que la acción aún necesita poder realizar cambios en la sesión.
¿Es posible detener una acción y comenzar la siguiente sin usar AsyncController
o [SessionState(SessionStateBehavior.ReadOnly)]
?
Si no es necesario?
Tenga cuidado al depender de 'IsClientConnected', ya que aparentemente puede ser un problema de rendimiento serio para verificarlo, consulte http://stackoverflow.com/questions/9094735/when-is-response-isclientconnected-slow – Keith
¡Hola, Keith! Tengo un problema similar pero no pude resolverlo incluso con su respuesta, (http://stackoverflow.com/questions/29235850/how-to-abort-long-running-ajax-request-in-net-mvc-4) ¿Hay alguna forma de ayudarme? O podría publicar un código de muestra suyo para activar 'this.Response.IsClientConnected' –