Ваша ошибка в том, что вы пытаетесь создать данные 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
.Все строки включены в демо в качестве комментариев.