web-dev-qa-db-fra.com

Comment renvoyer JSON à partir d'un service Web asmx 2.0

J'utilise .Net Framework 2.0/jQuery pour effectuer un appel Ajax vers un service Web 2.0. Peu importe ce que j'ai défini le contentType dans l'appel ajax, le service renvoie toujours XML. Je veux qu'il revienne Json!

Voici l'appel:

      $(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);
            }
          });
        });    

Voici à quoi ressemble l'en-tête de demande dans 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

J'ai essayé de définir le contentType sur 'text/json' et d'obtenir les mêmes résultats.

Voici la méthode du service 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

et voici ce qu'il retourne:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string>

Est-ce que quelqu'un sait comment forcer le service Web à renvoyer Json lorsque je demande Json?

S'il vous plaît, ne me dites pas de passer à .Net Framework 3.5 ou quelque chose comme ça (je ne suis pas si stupide). J'ai besoin d'une solution 2.0.

27
camainc

Ce n'est pas un problème pour renvoyer JSON des services ASMX dans ASP.NET 2. . Vous avez juste besoin des extensions ASP.NET AJAX installées.

Assurez-vous d'ajouter la décoration [ScriptService] à votre service Web. C'est ce qui demande à la partie côté serveur du framework ASP.NET AJAX de retourner JSON pour une requête correctement formée.

De plus, vous devrez supprimer le ".d" de "msg.d" dans mon exemple, si vous l'utilisez avec 2.0. Le ".d" est une fonction de sécurité fournie avec 3.5 .

35
Dave Ward

La réponse est enveloppée dans un élément car votre méthode indique qu'elle renverra une chaîne. Vous pouvez l'utiliser pour pouvoir envoyer du json simple, mais votre wsdl sera dupe (la fonction est nulle mais répond aux données).

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

Bonne chance, tom

BTW: voir Newtonsoft.Json pour JsonConvert

12
Tom

Vous devez décorer votre méthode Web avec les éléments suivants:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

Vous avez le reste bien :)

Plus d'informations sur Encosia et Blog d'Andrew Roland

EDIT: Comme indiqué ci-dessous, il s'agit uniquement de .NET 3.5 (je n'étais pas au courant de cela, mon mauvais).

10
Darko Z

Vous pouvez utiliser la bibliothèque JayrockDémarrage rapide pour asp.net

Cela vous permet d'écrire un gestionnaire http pour vous renvoyer 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!";
        }
    }
}
2
redsquare

Vous ne pouvez probablement rien faire d'autre que la sérialisation XML ou binaire dans .NET 2.0. Si vous n'utilisez pas de référence Web générée automatiquement, ne vous embêtez pas avec ASMX. Utilisez simplement un ASPX ou un ASHX à la place.

2
Mark Cidade

Il est également possible d'écrire simplement votre propre convertisseur JSON rapide à l'aide de Reflection.

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("}")    
1
Seth

Je ne suis peut-être pas correct à 100%, mais je suis sûr que les services Web .net sont basés sur XML/SOAP.

Vous devez remplacer le comportement par défaut du service Web. Je ne suis pas tout à fait sûr que ce serait même possible.

Je sais que ce ne sera pas la réponse la plus utile, mais cela peut vous amener dans la bonne direction.

0
Jon P