Вопрос

Я создал файл 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top