Подтвердить что ты не робот

Веб-служба 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"}]

Любые идеи? Благодарим за помощь.

4b9b3361

Ответ 1

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"} ] }

Это, однако, на самом деле весьма желательно, для дополнительной безопасности

Ответ 2

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

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

Он работал как шарм.

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

FYI: все веб-методы должны быть статическими

[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;
    }

Ответ 8

Вместо того, чтобы возвращать строку в вашем WebMethod, используйте:

JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));