2008-10-17 24 views
59

Creé un archivo ASMX con un código detrás del archivo. Está funcionando bien, pero está generando XML.Cómo permitir que una salida de archivo ASMX JSON

Sin embargo, lo necesito para dar salida a JSON. La configuración de ResponseFormat no parece funcionar. Mi código subyacente 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" }; 
    } 
} 
+0

duplicado posible de [servicio web ASMX cómo devolver JSON sin una envoltura XML?] (Https://stackoverflow.com/questions/14950578/asmx-web-service-how-to-return-json- sin-xml-envoltura) –

Respuesta

40

De WebService returns XML even when ResponseFormat set to JSON:

Asegúrese de que la solicitud es una solicitud POST, no un GET. Scott Guthrie tiene un post explaining why.

pesar de que está escrito específicamente para jQuery, esto también puede ser útil para usted:
Using jQuery to Consume ASP.NET JSON Web Services

+7

Alternativamente, también puede añadir el siguiente anotación [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] cadena pública TestData() para permitir que se interponen en su webservices –

+1

Wow . ¿Quién hubiera adivinado que no podría obtener una respuesta 'JSON' con una solicitud' GET'. Increíble. Gracias por esto, ¡me estaba arrancando el pelo! – crush

+3

No estoy de acuerdo con que una solicitud POST sea apropiada aquí. El punto final no espera datos y el OP no está enviando datos al servidor (a diferencia de la publicación de Scott G) y ciertamente no tiene la intención de cambiar los datos en el servidor. De hecho, el OP tiene el atributo correcto ScriptMethod para permitir una solicitud GET - UseHttpGet = true. Simplemente están invocando un punto final para 'obtener' algunos datos. Una solicitud GET está bien; lo único que falta es establecer el tipo de contenido en la solicitud, ver mi respuesta a continuación. – bitsprint

4

son usted que llama al servicio web desde el script de cliente o en el lado del servidor?

Puede que le sea útil enviar un encabezado de tipo de contenido al servidor, p.

'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 especificar esto. Creo que jQuery tiene un método getJSON.

+0

Esta es la respuesta correcta en mi mente. Si bien es un buen consejo usar una solicitud posterior, no hay nada de malo en el código tal como está escrito en el PO. El posible culpable es que el encabezado del tipo de contenido es incorrecto. JQuery, por ejemplo, envía 'application/json' por sí mismo, pero incluye algunos valores 'text/xml' adicionales que hacen que asp.net aún devuelva xml. –

9

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

Además, necesita decirle al servicio web Content-Type: application/json para recuperar JSON de la llamada (estoy usando jQuery y el artículo 3 Mistakes To Avoid When Using jQuery fue muy esclarecedor, es del mismo sitio web mencionado en otra respuesta aquí).

12

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

  • [ScriptService] atributo de la clase de servicio web
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] el método
  • Content-type: application/json en la solicitud de

Con esas piezas en su lugar, una petición GET es exitosa

+0

Lo interesante es que se requiere la aplicación/json, y cuando no esté allí, devolverá el XML de mi experiencia con Fiddler. ¿Una forma un poco hacky de devolver ambos tipos de datos? – SimpsOff

+3

¿Por qué en el mundo se requiere establecer 'Content-type' en' application/json'? ¿No debería '[ScriptMethod (ResponseFormat = ResponseFormat.Json)]' hacer eso automáticamente? Increíble. Gracias por la investigación. – crush

+0

'[ScriptMethod ...' parece tener problemas para compilar en mi caso. Está teniendo problemas para encontrar la definición de 'UseHttpGet', y si intento importar' ScriptMethodAttribute' o decir 'ScriptMethodAttribute.UseHttpGet', entonces dice que se requiere una expresión constante. – Panzercrisis

3

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

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

51

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 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}"); 
     } 
    } 
+0

También funciona cuando se quiere devolver XML sin un contenedor XML adicional. – kad81

+0

No, realmente no tiene que hacer eso, como lo prueban las otras respuestas. Tengo un montón de servicios heredados que regresan JSON o XML dependiendo de lo que el cliente web solicite y nunca haya tenido que recurrir a la escritura directamente en la secuencia de respuesta. –

+0

¡Por favor, comparta su código! – LarryBud