Ответ JQuery AJAX всегда ничего не возвращает - PullRequest
1 голос
/ 25 февраля 2011

Следующий код возвращает пустой ответ независимо от того, существует функция или даже полностью отсутствует файл веб-службы:

$.ajax({
    url: "/ws.asmx/HelloWorld"
    , type: "POST"
    , contentType: 'application/json; charset=utf-8'
    , data: '{ FileName: "' + filename + '" }'
    , dataType: 'json'
    , success: function (data) {

    }
});

Почему это так?

Также может бытьСтоит отметить, $.load() отлично работает!

Ответы [ 7 ]

4 голосов
/ 26 февраля 2011

Ваша ошибка в том, что вы пытаетесь создать данные JSON вручную и делаете это неправильно:

'{ FileName: "' + filename + '" }'

Код должен быть исправлен как минимум в следующем

'{ "FileName": "' + filename + '" }'

поскольку они соответствуют спецификации JSON , имена свойств также должны быть заключены в двойные кавычки.

Следующая проблема может возникнуть, если filename содержит какие-то специальные символы.Например, в случае

var filename = '"C:\\Program Files"'; // the '\' must be escaped in the string literal

вы должны иметь в качестве данных соответствующую строку JSON

'{ "FileName": "\\"C:\\\\Program Files\\"" }'

в качестве соответствующих данных JSON из-за '\' и '"' должен быть экранированным. Это выглядит сложно. Поэтому я строго рекомендую создавать строки JSON с учетом JSON.stringify функции из json2.js . Тогда код будет

$.ajax({
    type: "POST",
    url: "ws.asmx/HelloWorld",
    data: JSON.stringify({ FileName: filename }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        alert(data.d);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert("Error Occured!" + " | " + XMLHttpRequest.responseText +
               " | " + textStatus + " | " +  errorThrown);
    }
});

, который прост и понятен. Следующим преимуществом использования JSON.stringify является то, что в самых современных веб-браузерах есть поддержка native функция и функция работают очень быстро.

Кстати, в случае использования JSON.stringify вы можете легко вызвать метаданные веб-службы, имеющие в качестве параметров очень сложные структуры данных (классы), а не только строки.

ОБНОВЛЕНО : еще одно напоминание для уменьшения возможных недоразумений. Позже вы решите использовать HTTP GET вместо HTTP POST для вызова веб-метода, вам придется изменить параметр data с

JSON.stringify({ FileName: filename })

до

{ FileName: JSON.stringify(filename) }

ОБНОВЛЕНО 2 : вы можете загрузить этот проект Visual Studio 2010, который я использовал для тестирования всех, прежде чем опубликовать свой ответ,Я включил в качестве «Web-3.5.config» web.config для .NET 3.5.Все различные закомментированные data значения включены в default.htm.Если вы хотите создавать тесты с HTTP GET, вы должны раскомментировать раздел в web.config, который позволяет HttpGet и использовать ScriptMethod, имеющий UseHttpGet = true.Все строки включены в демо в качестве комментариев.

2 голосов
/ 25 февраля 2011

просто попробуйте использовать:

$.getJSON("/ws.asmx/HelloWorld", function(data){
   alert(data);
});

Проверьте, вернули ли вы данные.

1 голос
/ 25 февраля 2011
0 голосов
/ 25 февраля 2011

Я где-то читал, что заголовок contentType для POST должен быть: xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

и я пользуюсь им вслепую: это всегда работает.

- Пит

0 голосов
/ 25 февраля 2011

Если вы хотите отслеживать ошибки, вы можете добавить обратный вызов ошибки

$.ajax({
    url: "/ws.asmx/HelloWorld"
    , type: "POST"
    , contentType: 'application/json; charset=utf-8'
    , data: '{ FileName: "' + filename + '" }'
    , dataType: 'json'
    , success: function (data) {

    }
    , error: function (a, b, c) {

    }
});

Из jQuery:

error(jqXHR, textStatus, errorThrown)Function 

A function to be called if the request fails. The function receives

три аргумента: jqXHR (в jQuery 1.4.x, XMLHttpRequest) объект, строка, описывающая тип возникшей ошибки и необязательный объект исключения, если таковой произошел.Возможные значения для второго аргумента (кроме нуля): «timeout», «error», «abort» и «parsererror».Это Ajax Event.Начиная с jQuery 1.5, установка ошибки может принимать массив функций.Каждая функция будет вызываться по очереди.Примечание. Этот обработчик не вызывается для междоменных сценариев и запросов JSONP.

0 голосов
/ 25 февраля 2011

Служба возвращает значение?Если нет, он просто POST и ничего вам не вернет, потому что нет данных, чтобы увидеть ...

0 голосов
/ 25 февраля 2011

Убедитесь, что вы правильно загрузили файл jquery.js.

...