Cómo devolver JSON desde un servicio web 2.0 asmx

Estoy usando .Net framework 2.0 / jQuery para hacer una llamada Ajax a un servicio web 2.0. No importa en qué establezca el tipo de contenido en la llamada ajax, el servicio siempre devuelve XML. ¡Quiero que regrese Json!

Aquí está la llamada:

$(document).ready(function() { $.ajax({ type: "POST", url: "DonationsService.asmx/GetDate", data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { // Hide the fake progress indicator graphic. $('#RSSContent').removeClass('loading'); // Insert the returned HTML into the 
. $('#RSSContent').html(msg.d); } }); });

Aquí está cómo se ve el encabezado de solicitud en Fiddler:

 POST /DonationsService.asmx/GetDate HTTP/1.1 x-requested-with: XMLHttpRequest Accept-Language: en-us Referer: http://localhost:1238/text.htm Accept: application/json, text/javascript, */* Content-Type: application/json; charset=utf-8 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; eMusic DLM/4; .NET CLR 2.0.50727) Host: localhost:1238 Content-Length: 2 Connection: Keep-Alive Pragma: no-cache 

Intenté configurar el contentType en ‘text / json’ y obtuve los mismos resultados.

Aquí está el método de servicio web:

  _ Public Function GetDate() As String 'just playing around with Newtonsoft.Json Dim sb As New StringBuilder Dim sw As New IO.StringWriter(sb) Dim strOut As String = String.Empty Using jw As New JsonTextWriter(sw) With jw .WriteStartObject() .WritePropertyName("DateTime") .WriteValue(DateTime.Now.ToString) .WriteEndObject() End With strOut = sw.ToString End Using Return strOut End Function 

y aquí está lo que devuelve:

  {"DateTime":"11/13/2008 6:04:22 PM"} 

¿Alguien sabe cómo forzar al servicio web a devolver a Json cuando pregunto por Json?

Por favor, no me digan que actualice a .Net Framework 3.5 o algo por el estilo (no soy tan estúpido). Necesito una solución 2.0.

No es problema devolver JSON desde los servicios ASMX en ASP.NET 2.0 . Solo necesita instalar las extensiones ASP.NET AJAX.

Asegúrese de agregar la decoración [ScriptService] a su servicio web. Eso es lo que ordena a la parte del lado del servidor del marco AJAX de ASP.NET que devuelva JSON para una solicitud debidamente formada.

Además, deberá soltar “.d” de “msg.d” en mi ejemplo, si lo está utilizando con 2.0. El “.d” es una característica de seguridad que viene con 3.5 .

La respuesta está envuelta en un elemento porque tu método dice que devolverá una cadena. Puede usar esto para poder enviar json simple, pero su wsdl será engañado (la función es nula pero responde los datos).

 [WebMethod(Description="return pure JSON")] public void retrieveByIdToPureJSON( int id ) { Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) ); } 

Buena suerte, tom

Por cierto: ver Newtonsoft.Json para JsonConvert

Necesita decorar su método web con lo siguiente:

 [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

Tienes el rest bien 🙂

Más información en Encosia y Andrew Roland’s Blog

EDITAR: Como se indica a continuación, esto es solo .NET 3.5 (no estaba al tanto de esto, mi mal).

Probablemente no pueda hacer nada más que XML o serialización binaria en .NET 2.0. Si no está utilizando una referencia web autogenerada, no se moleste con ASMX. Simplemente use un ASPX o ASHX en su lugar.

Puede usar la biblioteca de Jayrock Inicio rápido para asp.net

Esto te permite escribir un manejador de http para devolverte el json.

 <%@ WebHandler Class="JayrockWeb.HelloWorld" %> namespace JayrockWeb { using System; using System.Web; using Jayrock.Json; using Jayrock.JsonRpc; using Jayrock.JsonRpc.Web; public class HelloWorld : JsonRpcHandler { [ JsonRpcMethod("greetings") ] public string Greetings() { return "Welcome to Jayrock!"; } } } 

También es posible escribir su propio convertidor JSON rápido con Refelction.

 Dim sb As New StringBuilder("{") For Each p As PropertyInfo In myObject.GetType().GetProperties() sb.Append(String.Format("""{0}"":""{1}"",", p.Name, p.GetValue(myObject, Nothing).ToString())) Next p //remove the last "," because it's uneeded. sb.Remove(sb.Length - 1, 1) sb.Append("}") 

Puede que no sea 100% correcto en esto, pero estoy seguro de que los servicios web .net están basados ​​en XML / SOAP.

Debería anular el comportamiento predeterminado del servicio web. No estoy del todo seguro de que esto sea posible.

Sé que esta no será la respuesta más útil, pero puede llevarlo en la dirección correcta.