Веб-служба ASP.NET JSON всегда возвращает ответ JSON в формате XML.

Я видел аналогичный вопрос, но это не решило мою проблему. У меня есть веб-служба JSON в файле ASMX;

Код для веб-метода

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetUserRoles(string JSONUserCode)
        {
            string retRoles = string.Empty;
            List<JSONRole> roles = new List<JSONRole>();

            {... I Populate the roles here ...}

            DataContractJsonSerializer serializer = new
            DataContractJsonSerializer(roles.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, roles);
            string jsonString = Encoding.Default.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }

Это правильно форматирует список, но возвращает весь возврат в XML. Вот ответ:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/">
       [{"Name":"Accounts Payable"},{"Name":"Payroll"}]
    </string>

Вы можете просмотреть ответ самостоятельно, щелкнув эту ссылку:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234.

Мне нужно, чтобы ответ был справедливым:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}]

Любые идеи? Спасибо за вашу помощь.


person JohnnyCantCode    schedule 13.07.2009    source источник


Ответы (9)


WebMethod может обслуживать ту же информацию, что и XML, и JSON. Вам нужно указать, какой формат вы хотите (dataType) в клиенте, когда вы отправляете свой запрос.

Кроме того, вы не должны сериализовать объект в JSON вручную, а должны возвращать роли, и он будет сериализован в JSON, если ваш клиент запросит данные как JSON.

ИЗМЕНИТЬ

Пример jQuery (обратите внимание на параметр dataType):

$.ajax({
   type: 'GET',
   url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles',
   contentType: 'application/json; charset=utf-8',
   dataType: 'json',
   data: '{"JSONUserCode":"1234"}',
   success: myCallback
});

Стоит отметить, что объект не будет возвращен точно в указанном вами формате, а будет заключен в объект:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] }

Однако на самом деле это очень желательно, для дополнительной безопасности

person David Hedlund    schedule 13.07.2009
comment
Есть ли способ указать тип данных в POST? - person JohnnyCantCode; 14.07.2009
comment
Я не уверен, что следую ... приведенный выше пример - POST. - person David Hedlund; 14.07.2009
comment
Извините, я имею в виду передачу параметра в URL-адресе, как URL-адрес, который я включил в свой вопрос. - person JohnnyCantCode; 15.07.2009
comment
ах, верно. Я обновил свой пример выше, чтобы использовать URL-адрес и параметры, которые вы используете. Используя «GET» вместо «POST», данные, переданные в «data», будут извлекаться через строку запроса, а не через значения формы. - person David Hedlund; 15.07.2009
comment
Поскольку $ .ajax () не будет работать для межсайтового использования, я должен использовать $ .getJSON (), и моя служба возвращает JSONP. У меня такая же проблема, результат json завернут в xml. Поскольку я использую $ .getJSON (), я не уверен, как установить заголовки, чтобы сообщить службе, что мне нужен результат json, а не результат xml. Есть идеи, как это сделать, просто через URL-адрес? Есть ли какой-то встроенный параметр, который службы .NET ищут в строке запроса? - person Samuel Meacham; 12.10.2009

Оказывается, имеет значение не dataType, а

contentType: 'application/json; charset=utf-8'.  

Оно работало завораживающе.

person Sebastien Binette    schedule 11.11.2012

Убедитесь, что ваш класс обслуживания имеет атрибут [ScriptService]. Этот атрибут не добавляется по умолчанию.

person Pavel Morshenyuk    schedule 29.07.2010

Попробуйте Jayrock для .NET, это отличный обработчик для .NET JSON RPC. Он сделает именно то, что вам нужно. Пошаговое руководство для ASP .NET JSON RPC здесь.

person Ivan    schedule 28.08.2010

Я совершил ту же ошибку, самостоятельно выполняя сериализацию. Вы должны возвращать не строку, а сам объект.

Если вы уже разработали сотню подобных сервисов, вам будет предложено решение: только что создали aspx, ServiceCaller.aspx, удалите все в html, просто оставьте директиву страницы и используйте выделенный код для вызова службы и Response. Запишите строку . Также возьмите имя метода службы в качестве параметра, например «HelloWorld», и используйте отражение для его вызова.

Это вроде как показать левое ухо правой рукой, но это работает. Вы также можете легко интегрировать управление ролями и с помощью отражения получить имя службы в виде строки, проверить базу данных, если пользователь может вызвать эту службу, и с отражением вызвать метод.

(любые комментарии по этому поводу приветствуются :)

person Emre    schedule 15.01.2011

Используйте так, чтобы не возвращать строковый тип. Просто напишите

public void Metod()
    {
        json = jss.Serialize(Data);
        Context.Response.Write(json);
    }
person Devadonn    schedule 23.03.2019

Мы создали еще одну страницу, которая вызывает серверную часть службы и записывает ответ (в нашем случае .aspx). Мы очистили весь HTML-код, тело документа doctype и сделали код на стороне сервера для вызова службы и ответа. Запишите его.

(в случае aspx просто оставьте директиву страницы вверху)

таким образом вы можете получить чистую струну.

Кстати, если это подвергает наше приложение каким-либо угрозам безопасности или серьезному снижению производительности, я был бы очень признателен за комментарии. Просто слишком занят, чтобы спрашивать об этом или искать по нему :)

person Emre    schedule 22.12.2010

Ваше пропущенное только "статическое" ключевое слово в объявлении метода, пожалуйста, обратите внимание на следующее: оно должно работать.

К вашему сведению: все веб-методы должны быть статическими

[WebMethod] [ScriptMethod (ResponseFormat = ResponseFormat.Json)]

    public static string GetUserRoles(string JSONUserCode)
    {
        string retRoles = string.Empty;
        List<JSONRole> roles = new List<JSONRole>();

        {... I Populate the roles here ...}

        DataContractJsonSerializer serializer = new
        DataContractJsonSerializer(roles.GetType());
        MemoryStream ms = new MemoryStream();
        serializer.WriteObject(ms, roles);
        string jsonString = Encoding.Default.GetString(ms.ToArray());
        ms.Close();
        return jsonString;
    }
person Community    schedule 21.04.2012

Вместо возврата строки в вашем WebMethod используйте:

JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
person JayC    schedule 16.05.2013