Веб-сервис ASP.NET JSON всегда возвращает ответ JSON, заключенный в XML - PullRequest
12 голосов
/ 13 июля 2009

Я видел похожий вопрос, но он не решил мою проблему. У меня есть веб-сервис 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"}]

Есть идеи? Спасибо за вашу помощь.

Ответы [ 9 ]

11 голосов
/ 13 июля 2009

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

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

EDIT

Пример 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"} ] }

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

3 голосов
/ 11 ноября 2012

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

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

Это сработало как шарм.

1 голос
/ 23 марта 2019

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

public void Metod()
    {
        json = jss.Serialize(Data);
        Context.Response.Write(json);
    }
1 голос
/ 15 января 2011

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

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

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

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

1 голос
/ 29 августа 2010

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

1 голос
/ 30 июля 2010

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

0 голосов
/ 16 мая 2013

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

JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
0 голосов
/ 21 апреля 2012

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

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

[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;
    }
0 голосов
/ 22 декабря 2010

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

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

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

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

...