Comment renvoyer JSON d'un service Web ASMX 2.0

j'utilise .net framework 2.0 / jQuery pour faire un appel Ajax à 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 que Json revienne!

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 requête 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 contentType à' text/json ' et d'obtenir les mêmes résultats.

voici le service web méthode:

<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 de quoi il en 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 à retourner Json quand je demande Json?

s'il vous Plaît ne me dites pas de mise à niveau .Net Framework 3.5 ou quelque chose comme ça (je ne suis pas stupide). J'ai besoin d'une solution 2.0.

27
demandé sur Amicable 2008-11-14 03:12:09

7 réponses

pas de problème return JSON from ASMX services in ASP.NET 2,0. Vous avez juste besoin de la ASP.NET AJAX Extensions installées.

assurez-vous d'ajouter la décoration [ScriptService] à votre service web. C'est ce qui instruit la partie Côté Serveur de la ASP.NET AJAX framework pour retourner JSON pour une requête correctement formée.

vous devez aussi laisser tomber le ".d" de "msg.d" dans mon exemple, si vous l'utilisez avec la 2.0. Le ".d" est une sécurité qui est venu avec 3.5.

35
répondu Dave Ward 2010-06-07 20:54:42

la réponse est enveloppée dans un élément parce que votre méthode dit qu'elle retournera une chaîne. Vous pouvez utiliser ceci pour pouvoir envoyer des JSON simples, mais votre wsdl sera dupé (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

11
répondu Tom 2011-03-22 14:37:04

vous devez décorer votre méthode web avec ce qui suit:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

Vous avez le reste de la droite :)



Plus d'infos sur Encosia et Le Blog D'Andrew Roland

EDIT: comme noté ci-dessous c'est .NET 3.5 seulement (je n'étais pas au courant de cela, ma faute).

10
répondu Darko Z 2008-11-14 01:37:04

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

2
répondu Mark Cidade 2008-11-14 00:20:12

Vous pouvez utiliser le Jayrock bibliothèque démarrage Rapide pour asp.net

cela vous permet d'écrire un gestionnaire http pour vous rendre 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
répondu redsquare 2008-11-14 02:29:21

il est également possible d'écrire votre propre convertisseur JSON rapide en utilisant 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("}")    
1
répondu Seth 2011-06-28 20:01:50

j'ai peut-être pas 100% correct sur ce sujet, mais j'en suis sûr .net, webservices XML/SOAP.

Vous devez remplacer le comportement par défaut du webservice. Je ne suis pas entièrement sûr que ce serait même possible.

je sais que ce ne sera pas la réponse la plus utile, mais vous pourriez vous diriger dans la bonne direction.

0
répondu Jon P 2008-11-14 00:23:18