asp.net asmx web service retournant xml au lieu de json

pourquoi ce simple service web refuse-t-il de rendre JSON au client?

Voici mon code client:

        var params = { };
        $.ajax({
            url: "/Services/SessionServices.asmx/HelloWorld",
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 10000,
            data: JSON.stringify(params),
            success: function (response) {
                console.log(response);
            }
        });

et le service:

namespace myproject.frontend.Services
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService]
    public class SessionServices : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

web.config:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
</configuration>

et la réponse:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>

peu importe ce que je fais, la réponse revient toujours en XML. Comment puis-je obtenir le service web pour retourner Json?

Modifier:

Voici la trace HTTP Du Violon:

REQUEST
-------
POST http://myproject.local/Services/SessionServices.asmx/HelloWorld HTTP/1.1
Host: myproject.local
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=utf-8
X-Requested-With: XMLHttpRequest
Referer: http://myproject.local/Pages/Test.aspx
Content-Length: 2
Cookie: ASP.NET_SessionId=5tvpx1ph1uiie2o1c5wzx0bz
Pragma: no-cache
Cache-Control: no-cache

{}

RESPONSE
-------
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 19 Jun 2012 16:33:40 GMT
Content-Length: 96

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">Hello World</string>

j'ai perdu le compte de combien d'articles j'ai lu maintenant essayer de corriger cela. Les instructions sont incomplètes ou ne résolvent pas mon problème pour une raison quelconque. Parmi les plus importantes, citons (toutes sans succès):

  • ASP.NET le service web renvoie par erreur XML au lieu de JSON
  • service web asmx retour xml au lieu de json .net 4.0
  • http://williamsportwebdeveloper.com/cgi/wp/?p=494
  • http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
  • http://forums.asp.net/t/1054378.aspx
  • http://jqueryplugins.info/2012/02/asp-net-web-service-returning-xml-instead-of-json/

Plus plusieurs autres articles généraux.

48
demandé sur Community 2012-06-18 21:51:32

10 réponses

a finalement compris.

le code app est correct tel qu'il est affiché. Le problème vient de la configuration. Le web correct.config est:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.webServer>
        <handlers>
            <add name="ScriptHandlerFactory"
                 verb="*" path="*.asmx"
                 type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
                 resourceType="Unspecified" />
        </handlers>
    </system.webServer>
</configuration>

selon le docs, l'enregistrement du gestionnaire ne devrait pas être nécessaire à partir de .NET 4 vers le haut car il a été déplacé à la machine.config. Pour quelque raison que ce soit, ce n'est pas de travail pour moi. Mais en ajoutant l'inscription sur le web.config pour mon application résolu le problème.

beaucoup d'articles sur ce problème indiquent d'ajouter le handler à la section <system.web> . Cela ne fonctionne pas et cause toute une charge d'autres problèmes. J'ai essayé d'ajouter le Gestionnaire aux deux sections et cela génère un ensemble d'autres erreurs de migration qui ont complètement mal dirigé mon dépannage.

au cas où cela aiderait quelqu'un d'autre, si j'avais le même problème à nouveau, voici la liste de contrôle que je passerais en revue:

  1. Avez-vous préciser type: "POST" dans la requête ajax?
  2. avez-vous spécifié contentType: "application/json; charset=utf-8" dans la demande ajax?
  3. avez-vous spécifié dataType: "json" dans la demande ajax?
  4. est-ce que votre .service web asmx inclure le [ScriptService] attribut?
  5. votre méthode web inclut-elle l'attribut [ScriptMethod(ResponseFormat = ResponseFormat.Json)] ? (Mon code fonctionne même sans cet attribut, mais beaucoup d'articles qui disent que c'est obligatoire)
  6. Avez-vous Ajouté le ScriptHandlerFactory au web.fichier de configuration dans <system.webServer><handlers> ?
  7. avez-vous retiré tous les manipulateurs du web.fichier de configuration dans <system.web><httpHandlers> ?

Espérons que cela aide quelqu'un avec le même problème. et merci aux affiches pour les suggestions.

42
répondu njr101 2017-03-29 22:10:04

pas de succès avec la solution ci-dessus, voici comment je l'ai résolu.

mettez cette ligne dans votre webservice et plutôt tapez retour juste écrire la chaîne dans le contexte de réponse

this.Context.Response.ContentType = "application/json; charset=utf-8";
this.Context.Response.Write(serial.Serialize(city));
21
répondu Ajay 2012-11-03 17:41:18

si vous voulez rester avec Framework 3.5, vous devez faire des changements dans le code comme suit.

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[ScriptService]
public class WebService : System.Web.Services.WebService
{
    public WebService()
    {
    }

    [WebMethod]
    public void HelloWorld() // It's IMP to keep return type void.
    {
        string strResult = "Hello World";
        object objResultD = new { d = strResult }; // To make result similarly like ASP.Net Web Service in JSON form. You can skip if it's not needed in this form.

        System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
        string strResponse = ser.Serialize(objResultD);

        string strCallback = Context.Request.QueryString["callback"]; // Get callback method name. e.g. jQuery17019982320107502116_1378635607531
        strResponse = strCallback + "(" + strResponse + ")"; // e.g. jQuery17019982320107502116_1378635607531(....)

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-length", strResponse.Length.ToString());
        Context.Response.Flush();

        Context.Response.Write(strResponse);
    }
}
11
répondu Kalpesh Desai 2013-09-08 13:51:13

il est beaucoup plus facile de retourner une chaîne pure du service web. Je l'appelle fonction de corbeau (rend facile à se rappeler).

  [WebMethod]
  public void Test()
    {
        Context.Response.Output.Write("and that's how it's done");    
    }

comme vous pouvez le voir, le type de retour est" nul", mais la fonction de corbeau retournera quand même la valeur que vous voulez.

6
répondu GabrielJ 2015-04-24 12:06:26

j'ai un .service web asmx (.NET 4.0) avec une méthode qui renvoie une chaîne de caractères. La chaîne est une liste sérialisée comme vous voyez dans beaucoup des exemples. Cela ramènera json qui n'est pas enveloppé dans XML. Pas de modifications sur le site web.configuration ou besoin de DLLs tiers.

var tmsd = new List<TmsData>();
foreach (DataRow dr in dt.Rows)
{

m_firstname = dr["FirstName"].ToString();
m_lastname = dr["LastName"].ToString();

tmsd.Add(new TmsData() { FirstName = m_firstname, LastName = m_lastname} );

}

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string m_json = serializer.Serialize(tmsd);

return m_json;

la partie du client qui utilise le service ressemble à ceci:

   $.ajax({
       type: 'POST',
       contentType: "application/json; charset=utf-8",
       dataType: 'json',
       url: 'http://localhost:54253/TmsWebService.asmx/GetTombstoneDataJson',
       data: "{'ObjectNumber':'105.1996'}",
       success: function (data) {
           alert(data.d);
       },
       error: function (a) {
           alert(a.responseText);
       }
   });
1
répondu smoore4 2013-05-08 10:12:09

pour moi, il fonctionne avec ce code que j'ai reçu de ce post:

Comment puis-je revenir json de mon service de repos WCF (.NET 4), en utilisant Json.Net sans que ce soit une ficelle, enveloppée dans des guillemets?

[WebInvoke(UriTemplate = "HelloWorld", Method = "GET"), OperationContract]
public Message HelloWorld()
{
    string jsonResponse = //Get JSON string here
    return WebOperationContext.Current.CreateTextResponse(jsonResponse, "application/json; charset=utf-8", Encoding.UTF8);
}
0
répondu j0aqu1n 2017-05-23 11:54:56

j'ai essayé toutes les étapes ci-dessus ( même la réponse), mais je n'ai pas réussi, ma configuration système est Windows Server 2012 R2, IIS 8. L'étape suivante a résolu mon problème.

a changé l'application pool, qui a géré pipeline = classic.

0
répondu Arindam Nayak 2014-04-09 14:39:11

je sais que c'est vraiment une vieille question, mais j'ai le même problème aujourd'hui, et j'ai cherché partout pour trouver la réponse, mais sans résultat. Après de longues recherches, j'ai trouvé le moyen de faire ce travail. Pour retourner JSON du service, vous avez fournir des données dans la demande dans le format correct, utiliser JSON.stringify() pour analyser les données avant la demande et ne pas oublier contentType: "application/json; charset=utf-8" , en utilisant ce devrait fournir le résultat attendu.

0
répondu Sebastian Siewień 2017-03-23 10:47:31

espérons que cela aide, il semble que vous ayez encore à envoyer un objet JSON dans la requête, même si la méthode que vous appelez n'a pas de paramètres.

var params = {};
return $http({
        method: 'POST',
        async: false,
        url: 'service.asmx/ParameterlessMethod',
        data: JSON.stringify(params),
        contentType: 'application/json; charset=utf-8',
        dataType: 'json'

    }).then(function (response) {
        var robj = JSON.parse(response.data.d);
        return robj;
    });
0
répondu Otto 2017-09-29 09:52:34
response = await client.GetAsync(RequestUrl, HttpCompletionOption.ResponseContentRead);
if (response.IsSuccessStatusCode)
{
    _data = await response.Content.ReadAsStringAsync();
    try
    {
        XmlDocument _doc = new XmlDocument();
        _doc.LoadXml(_data);
        return Request.CreateResponse(HttpStatusCode.OK, JObject.Parse(_doc.InnerText));
    }
    catch (Exception jex)
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest, jex.Message);
    }
}
else
    return Task.FromResult<HttpResponseMessage>(Request.CreateResponse(HttpStatusCode.NotFound)).Result;
-1
répondu Mohamed.Abdo 2015-12-08 09:26:22