Cómo dejar que un archivo ASMX emita JSON

Creé un archivo ASMX con un código detrás del archivo. Está funcionando bien, pero está generando XML.

Sin embargo, necesito que muestre JSON. La configuración de ResponseFormat no parece funcionar. Mi código detrás es:

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

Desde WebService devuelve XML incluso cuando ResponseFormat se establece en JSON :

Asegúrese de que la solicitud sea una solicitud POST, no un GET. Scott Guthrie tiene una publicación explicando por qué .

Aunque está escrito específicamente para jQuery, esto también puede serle útil:
Uso de jQuery para consumir servicios web ASP.NET JSON

Para recibir una cadena JSON pura, sin que esté envuelta en un XML, debe escribir la cadena JSON directamente en HttpResponse y cambiar el tipo de devolución de WebMethod a void .

  [System.Web.Script.Services.ScriptService] public class WebServiceClass : System.Web.Services.WebService { [WebMethod] public void WebMethodName() { HttpContext.Current.Response.Write("{property: value}"); } } 

Esta es probablemente una noticia vieja, pero la magia parece ser:

  • Atributo [ScriptService] en clase de servicio web
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] en el método
  • Tipo de contenido: application / json in request

Con esas piezas en su lugar, una solicitud GET es exitosa

Un truco rápido que aprendí de la manera difícil (básicamente, pasar 4 horas en Google), puede utilizar PageMethods en su archivo ASPX para devolver JSON (con el marcador [ScriptMethod ()] para un método estático, sin embargo, si decide mudarse sus métodos estáticos en un archivo asmx, no puede ser un método estático.

Además, necesita decirle al servicio web Content-Type: application / json para que JSON regrese de la llamada (estoy usando jQuery y los 3 errores para evitar al usar el artículo de jQuery fueron muy esclarecedores, es del mismo sitio web) mencionado en otra respuesta aquí).

¿Está llamando al servicio web desde el script del cliente o desde el servidor?

Es posible que le ayude enviar un encabezado de tipo de contenido al servidor, por ej.

‘application / json; charset = utf-8 ‘

En el lado del cliente, uso prototipo de biblioteca del lado del cliente y hay un parámetro contentType al hacer una llamada Ajax donde puede especificarlo. Creo que jQuery tiene un método getJSON.

Alternativa: utilice un controlador HTTP genérico (.ashx) y use su biblioteca json favorita para serializar y deserializar manualmente su JSON.

Descubrí que el control total sobre el manejo de una solicitud y la generación de una respuesta supera a cualquier otra oferta de .NET para servicios web RESTful simples.