jquery - consumir - web service c# json
Cómo devolver JSON desde un servicio web 2.0 asmx (7)
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 <div>.
$(''#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:
<WebMethod()> _
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:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string>
¿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.
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 resto 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).
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 .
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 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.
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("}")