Pregunta

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

Sin embargo, lo necesito para generar JSON. La configuración 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" };
    }
}
¿Fue útil?

Solución

De WebService devuelve XML incluso cuando ResponseFormat está establecido en JSON :

  

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

     

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

Otros consejos

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 retorno 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 vieja noticia para este momento, pero la magia parece ser:

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

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

Para un HTTP POST

  • [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] sobre el método

y en el lado del cliente (asumiendo que su método web se llama MethodName y toma un único parámetro llamado 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);
            }
        });

Gracias a que aprendí de la manera más difícil (básicamente pasé 4 horas en Google), puedes usar PageMethods en tu archivo ASPX para devolver JSON (con el marcador [ScriptMethod ()]) para un método estático, sin embargo, si decide mover tus métodos estáticos a un archivo asmx, no puede ser un método estático.

Además, debe indicarle al servicio web Content-Type: application / json para recuperar JSON de la llamada (estoy usando jQuery y el 3 errores que se deben evitar al usar jQuery El artículo fue muy esclarecedor. el mismo sitio web mencionado en otra respuesta aquí).

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

Puede resultarle útil enviar un encabezado de tipo de contenido al servidor, p.

'aplicación / json; charset = utf-8 '

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

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top