Cómo permitir que un archivo ASMX genere JSON
Creé un archivo ASMX con un archivo de código subyacente. Está funcionando bien, pero genera XML.
Sin embargo, lo necesito para generar 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" };
}
}
Para recibir una cadena JSON pura, sin que esté empaquetada en un XML, debe escribir la cadena JSON directamente en HttpResponse
y cambiar el WebMethod
tipo de retorno a void
.
[System.Web.Script.Services.ScriptService]
public class WebServiceClass : System.Web.Services.WebService {
[WebMethod]
public void WebMethodName()
{
HttpContext.Current.Response.Write("{property: value}");
}
}
Desde WebService devuelve XML incluso cuando ResponseFormat está configurado en JSON :
Asegúrese de que la solicitud sea una solicitud POST, no una GET. Scott Guthrie tiene una publicación que explica por qué .
Aunque está escrito específicamente para jQuery, esto también puede resultarle útil:
Uso de jQuery para consumir servicios web ASP.NET JSON
Probablemente ya sean noticias viejas, pero la magia parece ser:
- Atributo [ScriptService] en la clase de servicio web
- [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] en el método
- Tipo de contenido: aplicación/json en solicitud
Con esas piezas en su lugar, una solicitud GET se realiza correctamente.
Para una publicación HTTP
- [ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] en el método
y en el lado del cliente (asumiendo que su método web se llama MethodName y requiere 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);
}
});