visual - Qué sucede cuando hay un tiempo de espera de solicitud de red durante la solicitud de AJAX a la acción MVC de ASP.NET
mvc 5 visual studio 2015 (3)
Como se indica en el título, me gustaría saber qué sucede cuando se envía una solicitud AJAX a una acción del controlador y, durante este tiempo, se produce un tiempo de espera de red durante unos pocos ms antes de que se complete la solicitud.
Reply from <Server IP>: bytes=32 time=31ms TTL=122
Request timed out
Reply from <Server IP>: bytes=32 time=28ms TTL=122
Teniendo en cuenta que el tiempo de espera solo pasa un par de ms, ¿qué efectos tendría esto en mi solicitud de AJAX?
Esto es una continuación de un problema al que nos enfrentamos en nuestra aplicación, como se explica en esta pregunta SO, y me gustaría saber si están relacionados de alguna manera.
Busqué en Google problemas similares pero no encontré nada útil.
Editar: además del impacto en AJAX, ¿afectaría el comportamiento del método de acción (servidor)?
La solicitud "fallará", lo que significa que ingresará el estado onError
de su solicitud AJAX. El código de estado será entonces 0, ya que no hay respuesta del servidor para determinar el código de estado real (por ejemplo, 200 OK o 500 Internal Server Error).
Independientemente de si el tiempo de espera se produce solo por un par de ms o más, la solicitud fallará. La función de devolución de llamada correcta de su solicitud AJAX no se ejecutará y la solicitud finalizará con la ejecución de la función de devolución de llamada complete
. Por defecto, todas las solicitudes AJAX tendrán un tiempo de espera de 0 ms (ilimitado), pero alcanzará el tiempo de espera predeterminado del navegador.
Cuando se agota el tiempo de espera de una solicitud AJAX, se invoca la función de devolución de llamada de error
. El segundo argumento de esta función es una cadena que describe el tipo de error y en este caso, tendrá el valor de timeout
. Puede gestionar los tiempos de espera de solicitud gestionando esta función de devolución de llamada y especificando opcionalmente un valor de tiempo de espera (si no se especifica, funciona en el valor predeterminado) en el cuerpo de solicitud de AJAX:
$.ajax({
...
timeout: 5000, //specify the timeout value in milliseconds
error: function(jqXHR, textStatus, errorThrown) {
if(textStatus==="timeout") {
//code to execute when timeout occurs
}
}
});
Además, también puede verificar si la solicitud ha agotado el tiempo de espera en la función de devolución de llamada complete
(de forma similar a la mostrada anteriormente) marcando el segundo argumento, que es una cadena, y tendrá el valor de timeout
si la solicitud expiró.
Además, tenga en cuenta esto:
El período de tiempo de espera comienza en el punto en que se realiza la llamada $ .ajax; si hay varias solicitudes más en curso y el navegador no tiene conexiones disponibles, es posible que una solicitud expire antes de poder enviarse.
Los tiempos de espera de solicitudes generalmente se dejan en su estado predeterminado o se configuran como un valor predeterminado global utilizando $ .ajaxSetup () en lugar de anularse para solicitudes específicas con la opción de tiempo de espera excedido.
Le sugiero que use una herramienta alternativa de monitoreo de tráfico HTTP / s como violín para encontrar el misterio detrás de la segunda solicitud.
Más información: documentación jQuery ajax
En caso de tiempo de espera, su exitosa devolución de llamada no se ejecutará, por lo que debe escribir una devolución de llamada de error en el lado del cliente para manejar dichos problemas.
Debe plantear una excepción desde el lado del servidor en caso de que se agote el tiempo de espera, de modo que se devuelva al cliente como un error que es la única forma en que puede manejar el tiempo de espera.