Cómo obtener respuesta JSON de un servicio web 3.5 asmx

Tengo el siguiente método:

using System.Web.Services; using System.Web.Script.Services; using System.Web.Script.Serialization; using Newtonsoft.Json; using System.Collections; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] //[System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] // [System.Web.Script.Services.ScriptService] public class Tripadvisor : System.Web.Services.WebService { public Tripadvisor () { //Uncomment the following line if using designed components //InitializeComponent(); } [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public string HotelAvailability(string api) { JavaScriptSerializer js = new JavaScriptSerializer(); string json = js.Serialize(api); //JsonConvert.SerializeObject(api); return json ; } 

Aquí configuro el atributo ResponseFormat porque json sigue siendo devuelto como XML.

Quiero formatear json usando este servicio de asmx ¿Alguna idea?

Enfrenté el mismo problema e incluí el siguiente código para que funcione.

 [WebMethod] [ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)] public void HelloWorld() { Context.Response.Clear(); Context.Response.ContentType = "application/json"; Context.Response.Write("Hello World"); //return "Hello World"; } 

Actualizar:

Para obtener un formato JSON puro, puede usar el serializador de JavaScript como se muestra a continuación.

 public class WebService1 : System.Web.Services.WebService { [WebMethod] [ScriptMethod(UseHttpGet=true ,ResponseFormat = ResponseFormat.Json)] public void HelloWorld() { JavaScriptSerializer js = new JavaScriptSerializer(); Context.Response.Clear(); Context.Response.ContentType = "application/json"; HelloWorldData data = new HelloWorldData(); data.Message = "HelloWorld"; Context.Response.Write(js.Serialize(data)); } } public class HelloWorldData { public String Message; } 

Sin embargo, esto funciona para tipos complejos, pero la cadena no muestra ninguna diferencia.

Solo una duda ¿Cuándo no recibes una respuesta JSON? Porque cuando invocas el servicio web desde el cliente (supongo que es un navegador web, es decir, xhr), debes especificar el encabezado de tipo de contenido en la solicitud como “application / json; charset = yourcharset”.

Creo que la solución anterior siempre devuelve json, independientemente del tipo de contenido que especifique el cliente. El framework dotnet asmx permite esto usando el método de encabezado de tipo de contenido, por lo que lo anterior podría clasificarse como un hack, cuando hay una solución ordenada disponible.

Pregunta similar en Return Json Data del servicio web ASMX

Esto también podría ser útil -> http://forums.asp.net/p/1054378/2338982.aspx#2338982

PD: supongo que estás usando dotnet versión 4.

Estimados futuros lectores: La respuesta actualmente aceptada no es la correcta. Lo vincula al uso de JavaScriptSerializer y usted pierde la capacidad de solicitar xml (o, de hecho, cualquier formato de serialización que pueda aparecer en el futuro). ¡La “forma correcta” también implica menos código!

Si decora su clase de servicio con el [ScriptService] – que tiene – entonces ASP.NET 3.5+ debería serializar automáticamente la respuesta a JSON siempre que su llamada Ajax solicite JSON . Las sugerencias para serializar manualmente a JSON son simplemente incorrectas, a menos que desee utilizar un serializador diferente como Newtonsoft.

Que estabas viendo XML sugiere uno de los siguientes:

  • No está solicitando JSON en su llamada Ajax. Consulte el código de ejemplo de trabajo a continuación.
  • Posiblemente falten algunas entradas de web.config, según una respuesta aquí (descargo de responsabilidad: no tengo la mayoría de estas en una producción web.config, solo empiezo a jugar con ellas si nada funciona)

Aquí hay un ejemplo de trabajo simple de un servicio web ASMX habilitado para JSON:

 <%@ WebService Language="C#" Class="WebService" %> using System; using System.Collections.Generic; using System.Web.Services; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.WebService { [WebMethod] public MyClass Example() { return new MyClass(); } public class MyClass { public string Message { get { return "Hi"; } } public int Number { get { return 123; } } public List List { get { return new List { "Item1", "Item2", "Item3" }; } } } } 

JavaScript para solicitarlo y procesar la respuesta (simplemente mostraremos una alerta JS con el mensaje de MyClass.Message):

   Test       

Petición de Http:

 POST http://HOST.com/WebService.asmx/Example HTTP/1.1 Accept: application/json, text/javascript, */*; q=0.01 Content-Type: application/json; charset=utf-8 X-Requested-With: XMLHttpRequest Referer: http://HOST.com/Test.aspx Accept-Language: en-GB,en;q=0.5 Accept-Encoding: gzip, deflate User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0) Connection: Keep-Alive Content-Length: 3 Host: HOST.com { } 

Respuesta HTTP:

 HTTP/1.1 200 OK Cache-Control: private, max-age=0 Content-Type: application/json; charset=utf-8 Server: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Tue, 20 Feb 2018 08:36:12 GMT Content-Length: 98 {"d":{"__type":"WebService+MyClass","Message":"Hi","Number":123,"List":["Item1","Item2","Item3"]}} 

Resultado:

“Hola” se muestra en una ventana emergente JS.