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") строка после успешного удаления. Я могу удалить контент, но я не получаю этого сообщение. Это правильно или я делаю что-то неправильно? Как правильно решить эту проблему?

15 ответов


jQuery.ajax пытается преобразовать тело ответа в зависимости от указанного или 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 и отобразить сообщение внутри обратного вызова успеха:

Content-Type: application/json

{"message": "Record deleted"}

мне повезло с использованием нескольких, разделенных пробелами 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
});

вам просто нужно удалить тип данных:"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
});

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

в моем случае мой запрос jQuery Ajax был предотвращен из-за политика того же происхождения в Chrome. Все было решено, когда я изменил свой сервер (узел.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.


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

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

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


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

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

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


посмотреть этот. Также аналогичная проблема. Работая, я старался.

не удалить dataType: 'JSON',

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


У меня аналогичная проблема, но когда я попытался удалить тип данных:'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.

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

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. Думаю, это решит проблему.