Как сделать вывод файла ASMX JSON
Я создал файл 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" };
}
}
6 ответов:
с WebService возвращает XML, даже если ResponseFormat установлен в JSON:
убедитесь, что запрос является запросом POST, а не GET. Скотт Гатри имеет сообщение, объясняющее, почему.
хотя это написано специально для jQuery, это также может быть полезно для вас:
использование jQuery для потребления ASP.NET JSON Web Services
чтобы получить чистую строку 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)] по методу
- Content-type: application/json in request
С этими частями на месте, запрос GET успешно.
для HTTP POST
- [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] по методу
и на стороне клиента (предполагая, что ваш webmethod называется 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, это не может быть статический метод.
кроме того, вам нужно сообщить веб-службе Content-Type: application/json, чтобы вернуть JSON из вызова (я использую jQuery и 3 Ошибки, Чтобы Избежать При Использовании jQuery статья была очень поучительной-ее с того же сайта, упомянутого в другом ответе здесь).
вы вызываете веб-службу из клиентского скрипта или на стороне сервера?
вы можете обнаружить, что отправка заголовка типа контента на сервер поможет, например
'application/json; charset=utf-8'
на стороне клиента я использую прототипную клиентскую библиотеку, и при вызове Ajax есть параметр contentType, где вы можете указать это. Я думаю, что jQuery имеет метод getJSON.
альтернатива: используйте универсальный обработчик HTTP (.ashx) и используйте свою любимую библиотеку json для ручной сериализации и десериализации вашего JSON.
Я обнаружил, что полный контроль над обработкой запроса и генерацией ответа превосходит все, что предлагает .NET для простых, спокойных веб-сервисов.
Comments