Как разрешить файлу ASMX выводить JSON
Вопрос
Я создал файл ASMX с кодом, лежащим в основе файла.Он работает нормально, но выводит XML.
Однако мне это нужно для вывода JSON.Конфигурация ResponseFormat, похоже, не работает.Мой код, лежащий в основе, таков:
[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
[WebMethod]
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
public string[] UserDetails()
{
return new string[] { "abc", "def" };
}
}
Решение
От WebService возвращает XML, даже если ResponseFormat имеет значение JSON:
Убедитесь, что запрос является запросом POST, а не GET.У Скотта Гатри есть сообщение, объясняющее, почему.
Хотя он написан специально для jQuery, это также может быть полезно для вас:
Использование jQuery для использования ASP.NET Веб-сервисов JSON
Другие советы
Чтобы получить чистую строку JSON, без ее упаковки в XML, вы должны записать строку JSON непосредственно в HttpResponse
и изменить WebMethod
возвращаемый тип в void
.
[System.Web.Script.Services.ScriptService]
public class WebServiceClass : System.Web.Services.WebService {
[WebMethod]
public void WebMethodName()
{
HttpContext.Current.Response.Write("{property: value}");
}
}
Вероятно, это уже старые новости, но, похоже, волшебство в том, что:
- Атрибут [ScriptService] в классе веб-сервиса
- [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] для метода
- Тип контента:приложение / json в запросе
Когда эти элементы на месте, запрос GET выполняется успешно.
Для СООБЩЕНИЯ HTTP
- [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] для метода
и на стороне клиента (предполагая, что ваш веб-метод называется methodName, и он принимает один параметр с именем searchString):
$.ajax({
url: "MyWebService.asmx/MethodName",
type: "POST",
contentType: "application/json",
data: JSON.stringify({ searchString: q }),
success: function (response) {
},
error: function (jqXHR, textStatus, errorThrown) {
alert(textStatus + ": " + jqXHR.responseText);
}
});
Краткое замечание, которое я усвоил на собственном горьком опыте (в основном потратив 4 часа на Google): вы можете использовать PageMethods в своем ASPX-файле для возврата JSON (с маркером [ScriptMethod()] для статического метода, однако, если вы решите перенести свои статические методы в asmx-файл, это не может быть статический метод.
Кроме того, вам необходимо указать тип содержимого веб-службы:application / json для того, чтобы вернуть JSON из вызова (я использую jQuery и 3 Ошибки, которых следует избегать При использовании jQuery статья была очень поучительной - она с того же веб-сайта, упомянутого в другом ответе здесь).
Вы вызываете веб-службу из клиентского скрипта или на стороне сервера?
Вы можете обнаружить, что отправка заголовка типа контента на сервер поможет, например
'приложение/json;кодировка=utf-8'
На стороне клиента я использую библиотеку prototype на стороне клиента, и при выполнении Ajax-вызова есть параметр ContentType, где вы можете указать это.Я думаю, что в jQuery есть метод getJSON.
Альтернатива:Используйте универсальный HTTP-обработчик (.ashx) и используйте вашу любимую библиотеку json для ручной сериализации и десериализации вашего JSON.
Я обнаружил, что полный контроль над обработкой запроса и генерацией ответа превосходит все остальное.NET предлагает простые веб-сервисы RESTful.