Ajax-запрос возвращает 200 OK, но вместо успеха генерируется событие ошибки

Я реализовал запрос Ajax на своем веб-сайте и вызываю конечную точку с веб-страницы. Он всегда возвращает 200 OK, но jQuery выполняет событие ошибки. Я много чего перепробовал, но не смог разобраться в проблеме. Я добавляю свой код ниже:

Код JQuery

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

Код C# для JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

мне нужно ("Record deleted") строка после успешного удаления. Я могу удалить контент, но не получаю это сообщение. Это правильно или я делаю что-то не так? Как правильно решить эту проблему?

16 ответов

Решение

jQuery.ajax пытается преобразовать тело ответа в зависимости от указанного dataType параметр или Content-Type Заголовок отправлен сервером. Если преобразование не удается (например, если JSON/XML является недействительным), вызывается обратный вызов ошибки.


Ваш код AJAX содержит:

dataType: "json"

В этом случае jQuery:

Оценивает ответ как JSON и возвращает объект JavaScript. […] Данные JSON анализируются строго; любой искаженный JSON отклоняется и генерируется ошибка синтаксического анализа. […] Пустой ответ также отклоняется; сервер должен вернуть ответ null или {}.

Ваш серверный код возвращает фрагмент HTML с 200 OK статус. JQuery ожидал допустимый JSON и, следовательно, запускает функцию обратного вызова с ошибкой parseerror,

Решение состоит в том, чтобы удалить dataType параметр из вашего кода jQuery и возврат кода на стороне сервера:

Content-Type: application/javascript

alert("Record Deleted");

Но я бы предпочел вернуть JSON-ответ и отобразить сообщение в обратном вызове success:

Content-Type: application/json

{"message": "Record deleted"}

Вам просто нужно удалить dataType: "json" в вашем вызове AJAX

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

Мне повезло с использованием нескольких, разделенных пробелом dataTypes ( jQuery 1.5+). Как в:

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

Это только для записи, так как я наткнулся на этот пост, когда искал решение моей проблемы, которое было похоже на ОП.

В моем случае мой запрос jQuery Ajax был заблокирован из-за политики того же источника в Chrome. Все было решено, когда я изменил свой сервер (Node.js), чтобы сделать:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

Это буквально стоило мне часа удара головой о стену. Я чувствую себя глупо...

Я считаю, что ваша страница aspx не возвращает объект JSON. Ваша страница должна сделать что-то вроде этого (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

Также попробуйте изменить свой AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus должен дать вам тип ошибки, которую вы получаете.

Я столкнулся с этой проблемой с обновленной библиотекой jQuery. Если метод службы ничего не возвращает, это означает, что тип возвращаемого значения void,

Тогда в вашем звонке Ajax, пожалуйста, укажите dataType='text',

Это решит проблему.

Вы просто должны удалить dataType: 'json' из вашего заголовка, если ваш реализованный метод веб-службы недействителен.

В этом случае при вызове Ajax не ожидается тип возвращаемого JSON-типа.

Смотрите это. Это также похожая проблема. Работая я попробовал.

Не удаляйте dataType: 'JSON',

Примечание: echo only JSON Formate в PHP-файле, если вы используете только php echo, ваш ajax код возвращает 200

Используйте следующий код, чтобы убедиться, что ответ в формате JSON (версия PHP)...

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;

Я была такая же проблема. Моя проблема была в том, что мой контроллер возвращал код состояния вместо JSON. Убедитесь, что ваш контроллер возвращает что-то вроде:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

У меня похожая проблема, но когда я попытался удалить тип данных:'json', у меня все еще есть проблема. Моя ошибка выполняется вместо успеха

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}

Если вы всегда возвращаете JSON с сервера (без пустых ответов), dataType: 'json' должен работать и contentType не нужен Однако убедитесь, что вывод JSON...

JQuery AJAX сгенерирует 'parseerror' для действительного, но не сериализованного JSON!

Еще одна вещь, которая испортила мне жизнь, это использование localhost вместо 127.0.0.1 или наоборот. Очевидно, JavaScript не может обрабатывать запросы от одного к другому.

У меня такая же проблема. Это произошло потому, что мой ответ JSON содержит некоторые специальные символы, а файл сервера не был закодирован с помощью UTF-8, поэтому при вызове Ajax это не был действительный ответ JSON.

Ваш скрипт требует возврата в тип данных JSON.

Попробуй это:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}

Попробуйте следовать

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

ИЛИ ЖЕ

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

Используйте двойные кавычки вместо одинарных кавычек в объекте JSON. Я думаю, что это решит проблему.

Другие вопросы по тегам