¿Qué códigos de respuesta HTTP el manejador de errores jQuery aJax considera un 'error'?

Tengo una llamada estándar de aJax al server:

$.ajax({ type: 'POST', dataType: 'json', contentType: 'application/json', url: '/Apps/ResetDateAndCount', data: JSON.stringify({ appName: app }), success: function (response) { $('.lastReset').text(response); $('.currentCount').text('0'); }, error: function (xhr, status, error) { alert("You are not authorized to perform that action"); } }); 

Desde mi server (ASP.NET) estoy devolviendo errores como:

 return Json(new { success = false, error = "You are not authorized to perform that action" }); 

y

 Response.StatusCode = 401; return Json(new { success = false, error = "You are not authorized to perform that action" }); 

y

 Response.StatusCode = 500; return Json(new { success = false, error = "You are not authorized to perform that action" }); 

Dentro del error del controller de error: function (xhr, status, error) solo la última devolución se error: function (xhr, status, error) como un error, cuando el código de estado se establece en 500 .

Me pregunto qué códigos de respuesta aJax realmente consideran un "error".

Cualquier código de error que esté fuera del intervalo [200, 299] y diferente de 304 se considera un error por jQuery cuando se realiza una llamada AJAX.

Ahora, por supuesto, vas a preguntarme, está bien y muy bien, pero ¿por qué demonios esto no se considera un error? Después de todo, estoy devolviendo 401, que fuera del intervalo antes mencionado, por lo que debe considerarse un error:

 Response.StatusCode = 401; return Json(new { success = false, error = "You are not authorized to perform that action" }); 

Muy simple: porque cuando devuelve un código de estado 401 de una acción de controller en ASP.NET MVC, el marco (y más específicamente el module de Autenticación de formularios ASP.NET) interceptará esta request y lo networkingirigirá al formulario de inicio de session que finalmente dará como resultado un Código de estado 200 Sí, la página de inicio de session se sirve con un código de estado 200 OK. En este caso, 200 está dentro del intervalo, por lo que no se invoca ninguna callback por error . Puede validar esto inspeccionando el DOM de la página de inicio de session devuelta en su success callback para este caso particular.

Ahora colóquese en la perspectiva de un browser que realiza una request AJAX: seguirá todas las networkingirecciones que hace un server hasta que llega al destino final. Si este código de estado de destino final está fuera del intervalo y es diferente de 304, entonces se invocará la callback de error . OK, ahora las cosas empiezan a tener un poco más de sentido.

Entonces, la siguiente pregunta que me harás es ¿cómo invoco la callback de error si devuelvo un código de estado 401 de la acción de mi controller, ¿verdad? Luego, lo networkingirigiré (:-)) a la siguiente publicación del blog: Prevent Forms Authentication Login Page Redirect When You Don't Want It .

Sugeriría verificar la list de códigos HTTP estándar. Véalo aquí https://en.wikipedia.org/wiki/List_of_HTTP_status_codes . Es autoexplicativo.

En otras palabras, cualquier código> = 400 (4xx, 5xx) se puede considerar como un error.

Está devolviendo el post de error: "You are not authorized to perform that action"

Yo diría que este post de text corresponde principalmente a los códigos 401/403. Para los errores 5xx, le sugiero que muestre algún post de error del server.