2017-01-10 2 views
3

У меня есть стандартный АЯКС вызов обратно на сервер:Какие коды ответов HTTP обрабатывает обработчик ошибок jQuery aJax «ошибка»?

$.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"); 
     } 
    }); 

От моего сервера (ASP.NET) Я возвращающегося ошибки как:

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

и

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

и

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

Внутри обработчика ошибок error: function (xhr, status, error)только последний возврат будет обнаружен как ошибка, когда код состояния установлен в 500.

Мне интересно, какие коды ответов aJax действительно считают «ошибкой»?

+1

Должна быть любая ошибка 4xx или 5xx с некоторыми исключениями, например 401 (что обычно заставляет пользователя вводить учетные данные, вызывая только ошибку, если они отменяют). – cdhowie

ответ

7

Любой код ошибки, который находится за пределами интервала [200, 299] и отличается от 304, считается ошибкой jQuery при выполнении вызова AJAX.

Теперь, конечно, вы спросите меня, это прекрасно и денди, но почему, черт возьми, это не считается ошибкой, ведь я возвращаюсь 401, который находится за пределами вышеупомянутого интервала, поэтому его следует считать ошибкой:

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

Очень просто: потому что, когда вы возвращаетесь код статуса 401 из контроллера действий в ASP.NET MVC, в рамках (и более конкретно ASP.NET Forms модуль аутентификации) перехватывает этот запрос и перенаправить вас на форма входа в систему, в результате получившая код состояния 200. Да, страница входа в систему подается с кодом состояния 200 OK. В этом случае 200 находится внутри интервала, поэтому не вызывается обратный вызов error. Вы можете проверить это, проверив DOM на странице входа в систему, возвращенной в вашем обратном вызове success для данного конкретного случая.

Теперь поставите себя в точку зрения браузера, сделавшего запрос AJAX: Он будет следовать всем перенаправляемым, которые делает сервер, пока не достигнет конечного пункта назначения. Если этот код статуса конечного назначения находится за пределами интервала и отличается от 304, вы получите вызванный обратный вызов error. Хорошо, теперь все становится немного лучше.

Итак, следующий вопрос, который вы зададите мне, - это как мне вызвать обратный вызов ошибки, если я верну код статуса 401 из моего действия с контроллером, не так ли? Затем я перенаправляю вас (:-)) в следующее сообщение в блоге: Prevent Forms Authentication Login Page Redirect When You Don't Want It.

+0

Очень приятное расстояние (+1). Однако у меня есть вопрос, коды состояния формы 3xx считаются ошибками? Я спрашиваю, потому что я думаю, что это не ошибки. – Christos

+0

Нет, нет, нет. Прочтите мой ответ еще раз. И, самое главное, ** выделенная область **. Позвольте мне повторить еще раз: ** Он будет следовать всем переадресациям **, поэтому в основном нет такого понятия, как код состояния «3xx», когда вы совершаете вызов AJAX. Важно то, что код состояния ** конечного адресата **. Вы можете сделать миллионы переадресаций, но в конечном итоге вы в конечном итоге будете обслуживать некоторый HTML с кодом состояния 200 или сбой, как дерьмо с кодом состояния 5xx, потому что ваш сервер не работает. –

+0

А, ок. Спасибо :) ! – Christos

1

Я бы предложил проверить список стандартных HTTP-кодов. См. Здесь https://en.wikipedia.org/wiki/List_of_HTTP_status_codes. Это самоочевидно.

Другими словами, любые коды> = 400 (4xx, 5xx) можно рассматривать как ошибку.

Вы возвращаете сообщение об ошибке: "You are not authorized to perform that action"

Я бы сказал, это текстовое сообщение соответствует в основном 401/403 кодов. Для ошибок 5xx я бы предложил вам отобразить сообщение об ошибке сервера.

Смежные вопросы