2008-11-14 20 views
25

Estoy utilizando .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!Cómo devolver JSON desde un servicio web 2.0 asmx

Aquí es 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); 
      } 
      }); 
     });  

Esto es lo que ve el encabezado de la solicitud como 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 

He intentado fijar el contentType a 'text/json' y obtener la misma resultados.

Aquí es 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í es 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 el servicio web para volver JSON cuando pido 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.

+0

Quizás pueda usar mi solución; http://stackoverflow.com/questions/26140330/call-javascript-function-from-asmx – Erdogan

+0

Puede probar mi solución; http://stackoverflow.com/questions/26140330/call-javascript-function-from-asmx – Erdogan

Respuesta

35

No es problema return JSON from ASMX services in 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 el ".d" de "msg.d" en mi ejemplo, si lo está utilizando con 2.0.The ".d" is a security feature that came with 3.5.

+0

Lamentablemente, ese enlace encosia ahora está activando una advertencia de página de ataque en mi navegador. – TrojanName

2

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.

+1

ASHX es su respuesta –

0

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 sobrescribir 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.

10

lo necesario para decorar su método de web con el siguiente:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 

Tienes el resto derecho :)

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

EDIT: Como se ha señalado por debajo de este es .NET 3.5 solamente (no estaba al tanto de esto, mi mal).

+2

La enumeración 'ResponseFormat' sólo se admite desde el 3,5 en adelante, OP preguntó cómo se puede hacer en FW 2.0. – Kev

+1

@Kev ¿qué es OP? – Omu

+2

@Omu Original Poster como en la persona que hizo la pregunta (o en los foros la persona que inició el hilo) –

2

Puede utilizar el Jayrock library Quick start for asp.net

Esto le permite escribir un controlador HTTP para volver que 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!"; 
     } 
    } 
} 
+0

De hecho, lo consideré como una posible solución, si no podía hacerlo con simple 'ol asp.net. Gracias. – camainc

11

La respuesta está envuelta en un elemento porque su 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

BTW: ver Newtonsoft.Json para JsonConvert

+3

Eso simple. Cambie de Función a Sub (en Vb.net) y suelte el retorno, pero use un response.write para dar salida. 2 semanas de probar varias cosas para deshacerme de esa horrible Cuando hice un Return. Me salvó el día. Tnxs – KriZ

+0

truco sucio pero hace el trabajo, gracias :-) –

+0

Quiero abrazarte ahora, me llevó horas encontrar tu solución :) – Loves2Develop

1

También es posible que acaba de escribir su propio convertidor de JSON rápida usando 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("}")  
Cuestiones relacionadas