Веб-служба 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"}]
Любые идеи? Благодарим за помощь.
Ответы
Ответ 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));